donobu 2.15.1 → 2.16.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/assets/control-panel.js +30 -3
- package/dist/assets/generated/parameter-schemas.json +33 -33
- package/dist/assets/generated/version +1 -1
- package/dist/assets/interactive-elements-tracker.js +351 -0
- package/dist/assets/page-interactions-tracker.js +39 -20
- package/dist/assets/smart-selector-generator.js +38 -15
- package/dist/bindings/FocusPage.d.ts +6 -1
- package/dist/bindings/FocusPage.d.ts.map +1 -1
- package/dist/bindings/FocusPage.js +2 -8
- package/dist/bindings/FocusPage.js.map +1 -1
- package/dist/bindings/PageInteractionTracker.d.ts +9 -2
- package/dist/bindings/PageInteractionTracker.d.ts.map +1 -1
- package/dist/bindings/PageInteractionTracker.js +27 -3
- package/dist/bindings/PageInteractionTracker.js.map +1 -1
- package/dist/bindings/ProposeToolCall.d.ts +20 -0
- package/dist/bindings/ProposeToolCall.d.ts.map +1 -0
- package/dist/bindings/ProposeToolCall.js +29 -0
- package/dist/bindings/ProposeToolCall.js.map +1 -0
- package/dist/bindings/ToggleDonobuAnnotations.d.ts +5 -2
- package/dist/bindings/ToggleDonobuAnnotations.d.ts.map +1 -1
- package/dist/bindings/ToggleDonobuAnnotations.js +12 -6
- package/dist/bindings/ToggleDonobuAnnotations.js.map +1 -1
- package/dist/esm/assets/control-panel.js +30 -3
- package/dist/esm/assets/generated/parameter-schemas.json +33 -33
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/assets/interactive-elements-tracker.js +351 -0
- package/dist/esm/assets/page-interactions-tracker.js +39 -20
- package/dist/esm/assets/smart-selector-generator.js +38 -15
- package/dist/esm/bindings/FocusPage.d.ts +6 -1
- package/dist/esm/bindings/FocusPage.d.ts.map +1 -1
- package/dist/esm/bindings/FocusPage.js +2 -8
- package/dist/esm/bindings/FocusPage.js.map +1 -1
- package/dist/esm/bindings/PageInteractionTracker.d.ts +9 -2
- package/dist/esm/bindings/PageInteractionTracker.d.ts.map +1 -1
- package/dist/esm/bindings/PageInteractionTracker.js +27 -3
- package/dist/esm/bindings/PageInteractionTracker.js.map +1 -1
- package/dist/esm/bindings/ProposeToolCall.d.ts +20 -0
- package/dist/esm/bindings/ProposeToolCall.d.ts.map +1 -0
- package/dist/esm/bindings/ProposeToolCall.js +29 -0
- package/dist/esm/bindings/ProposeToolCall.js.map +1 -0
- package/dist/esm/bindings/ToggleDonobuAnnotations.d.ts +5 -2
- package/dist/esm/bindings/ToggleDonobuAnnotations.d.ts.map +1 -1
- package/dist/esm/bindings/ToggleDonobuAnnotations.js +12 -6
- package/dist/esm/bindings/ToggleDonobuAnnotations.js.map +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/esm/managers/CodeGenerator.js +2 -1
- package/dist/esm/managers/CodeGenerator.js.map +1 -1
- package/dist/esm/managers/ControlPanel.d.ts +124 -0
- package/dist/esm/managers/ControlPanel.d.ts.map +1 -0
- package/dist/esm/managers/ControlPanel.js +282 -0
- package/dist/esm/managers/ControlPanel.js.map +1 -0
- package/dist/esm/managers/DonobuFlow.d.ts +4 -12
- package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/esm/managers/DonobuFlow.js +35 -140
- package/dist/esm/managers/DonobuFlow.js.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.d.ts +9 -15
- package/dist/esm/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/esm/managers/InteractionVisualizer.js +44 -44
- package/dist/esm/managers/InteractionVisualizer.js.map +1 -1
- package/dist/esm/managers/PageInspector.d.ts +242 -0
- package/dist/esm/managers/PageInspector.d.ts.map +1 -0
- package/dist/esm/managers/PageInspector.js +783 -0
- package/dist/esm/managers/PageInspector.js.map +1 -0
- package/dist/esm/managers/ToolManager.d.ts.map +1 -1
- package/dist/esm/managers/ToolManager.js +3 -5
- package/dist/esm/managers/ToolManager.js.map +1 -1
- package/dist/esm/models/InteractableElement.d.ts +2 -2
- package/dist/esm/models/ToolCallContext.d.ts +6 -2
- package/dist/esm/models/ToolCallContext.d.ts.map +1 -1
- package/dist/esm/playwrightTestExtensions.d.ts +5 -0
- package/dist/esm/playwrightTestExtensions.d.ts.map +1 -1
- package/dist/esm/playwrightTestExtensions.js +52 -13
- package/dist/esm/playwrightTestExtensions.js.map +1 -1
- package/dist/esm/tools/AnalyzePageTextTool.js +1 -1
- package/dist/esm/tools/AnalyzePageTextTool.js.map +1 -1
- package/dist/esm/tools/AssertPageTextTool.js +1 -1
- package/dist/esm/tools/AssertPageTextTool.js.map +1 -1
- package/dist/esm/tools/AssertTool.d.ts.map +1 -1
- package/dist/esm/tools/AssertTool.js +4 -4
- package/dist/esm/tools/AssertTool.js.map +1 -1
- package/dist/esm/tools/ChangeWebBrowserTabTool.d.ts.map +1 -1
- package/dist/esm/tools/ChangeWebBrowserTabTool.js +8 -7
- package/dist/esm/tools/ChangeWebBrowserTabTool.js.map +1 -1
- package/dist/esm/tools/ClickTool.js +1 -1
- package/dist/esm/tools/ClickTool.js.map +1 -1
- package/dist/esm/tools/CreateBrowserCookieReportTool.js +1 -1
- package/dist/esm/tools/CreateBrowserCookieReportTool.js.map +1 -1
- package/dist/esm/tools/CustomToolRunnerTool.d.ts.map +1 -1
- package/dist/esm/tools/CustomToolRunnerTool.js +1 -1
- package/dist/esm/tools/CustomToolRunnerTool.js.map +1 -1
- package/dist/esm/tools/DetectBrokenLinksTool.js +1 -1
- package/dist/esm/tools/DetectBrokenLinksTool.js.map +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/esm/tools/ExtractPaymentProviderKeyTool.js +1 -1
- package/dist/esm/tools/ExtractPaymentProviderKeyTool.js.map +1 -1
- package/dist/esm/tools/ExtractPublicFacebookEntityDataTool.js +1 -1
- package/dist/esm/tools/ExtractPublicFacebookEntityDataTool.js.map +1 -1
- package/dist/esm/tools/GoForwardOrBackTool.js +1 -1
- package/dist/esm/tools/GoForwardOrBackTool.js.map +1 -1
- package/dist/esm/tools/GoToGoogleMapsStreetViewTool.js +1 -1
- package/dist/esm/tools/GoToGoogleMapsStreetViewTool.js.map +1 -1
- package/dist/esm/tools/GoToWebpageTool.js +1 -1
- package/dist/esm/tools/GoToWebpageTool.js.map +1 -1
- package/dist/esm/tools/HoverOverElementTool.d.ts.map +1 -1
- package/dist/esm/tools/HoverOverElementTool.js +1 -1
- package/dist/esm/tools/HoverOverElementTool.js.map +1 -1
- package/dist/esm/tools/NavigateWithinStreetView.js +1 -1
- package/dist/esm/tools/NavigateWithinStreetView.js.map +1 -1
- package/dist/esm/tools/PressKeyTool.js +1 -1
- package/dist/esm/tools/PressKeyTool.js.map +1 -1
- package/dist/esm/tools/ReloadPageTool.js +1 -1
- package/dist/esm/tools/ReloadPageTool.js.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.d.ts +16 -1
- package/dist/esm/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.js +169 -16
- package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
- package/dist/esm/tools/RunAccessibilityTestTool.d.ts +8 -0
- package/dist/esm/tools/RunAccessibilityTestTool.d.ts.map +1 -1
- package/dist/esm/tools/RunAccessibilityTestTool.js +15 -2
- package/dist/esm/tools/RunAccessibilityTestTool.js.map +1 -1
- package/dist/esm/tools/RunInlineJavaScriptCodeTool.d.ts.map +1 -1
- package/dist/esm/tools/RunInlineJavaScriptCodeTool.js +1 -1
- package/dist/esm/tools/RunInlineJavaScriptCodeTool.js.map +1 -1
- package/dist/esm/tools/SaveWebpageAsPdfTool.js +1 -1
- package/dist/esm/tools/SaveWebpageAsPdfTool.js.map +1 -1
- package/dist/esm/tools/ScrollPageTool.d.ts +1 -1
- package/dist/esm/tools/ScrollPageTool.d.ts.map +1 -1
- package/dist/esm/tools/ScrollPageTool.js +47 -4
- package/dist/esm/tools/ScrollPageTool.js.map +1 -1
- package/dist/esm/tools/WaitTool.js +1 -1
- package/dist/esm/tools/WaitTool.js.map +1 -1
- package/dist/esm/utils/MiscUtils.d.ts +2 -2
- package/dist/esm/utils/MiscUtils.js +2 -2
- package/dist/esm/utils/PlaywrightUtils.d.ts +26 -127
- package/dist/esm/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/esm/utils/PlaywrightUtils.js +133 -935
- package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
- package/dist/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/managers/CodeGenerator.js +2 -1
- package/dist/managers/CodeGenerator.js.map +1 -1
- package/dist/managers/ControlPanel.d.ts +124 -0
- package/dist/managers/ControlPanel.d.ts.map +1 -0
- package/dist/managers/ControlPanel.js +282 -0
- package/dist/managers/ControlPanel.js.map +1 -0
- package/dist/managers/DonobuFlow.d.ts +4 -12
- package/dist/managers/DonobuFlow.d.ts.map +1 -1
- package/dist/managers/DonobuFlow.js +35 -140
- package/dist/managers/DonobuFlow.js.map +1 -1
- package/dist/managers/InteractionVisualizer.d.ts +9 -15
- package/dist/managers/InteractionVisualizer.d.ts.map +1 -1
- package/dist/managers/InteractionVisualizer.js +44 -44
- package/dist/managers/InteractionVisualizer.js.map +1 -1
- package/dist/managers/PageInspector.d.ts +242 -0
- package/dist/managers/PageInspector.d.ts.map +1 -0
- package/dist/managers/PageInspector.js +783 -0
- package/dist/managers/PageInspector.js.map +1 -0
- package/dist/managers/ToolManager.d.ts.map +1 -1
- package/dist/managers/ToolManager.js +3 -5
- package/dist/managers/ToolManager.js.map +1 -1
- package/dist/models/InteractableElement.d.ts +2 -2
- package/dist/models/ToolCallContext.d.ts +6 -2
- package/dist/models/ToolCallContext.d.ts.map +1 -1
- package/dist/playwrightTestExtensions.d.ts +5 -0
- package/dist/playwrightTestExtensions.d.ts.map +1 -1
- package/dist/playwrightTestExtensions.js +52 -13
- package/dist/playwrightTestExtensions.js.map +1 -1
- package/dist/tools/AnalyzePageTextTool.js +1 -1
- package/dist/tools/AnalyzePageTextTool.js.map +1 -1
- package/dist/tools/AssertPageTextTool.js +1 -1
- package/dist/tools/AssertPageTextTool.js.map +1 -1
- package/dist/tools/AssertTool.d.ts.map +1 -1
- package/dist/tools/AssertTool.js +4 -4
- package/dist/tools/AssertTool.js.map +1 -1
- package/dist/tools/ChangeWebBrowserTabTool.d.ts.map +1 -1
- package/dist/tools/ChangeWebBrowserTabTool.js +8 -7
- package/dist/tools/ChangeWebBrowserTabTool.js.map +1 -1
- package/dist/tools/ClickTool.js +1 -1
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/CreateBrowserCookieReportTool.js +1 -1
- package/dist/tools/CreateBrowserCookieReportTool.js.map +1 -1
- package/dist/tools/CustomToolRunnerTool.d.ts.map +1 -1
- package/dist/tools/CustomToolRunnerTool.js +1 -1
- package/dist/tools/CustomToolRunnerTool.js.map +1 -1
- package/dist/tools/DetectBrokenLinksTool.js +1 -1
- package/dist/tools/DetectBrokenLinksTool.js.map +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
- package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
- package/dist/tools/ExtractPaymentProviderKeyTool.js +1 -1
- package/dist/tools/ExtractPaymentProviderKeyTool.js.map +1 -1
- package/dist/tools/ExtractPublicFacebookEntityDataTool.js +1 -1
- package/dist/tools/ExtractPublicFacebookEntityDataTool.js.map +1 -1
- package/dist/tools/GoForwardOrBackTool.js +1 -1
- package/dist/tools/GoForwardOrBackTool.js.map +1 -1
- package/dist/tools/GoToGoogleMapsStreetViewTool.js +1 -1
- package/dist/tools/GoToGoogleMapsStreetViewTool.js.map +1 -1
- package/dist/tools/GoToWebpageTool.js +1 -1
- package/dist/tools/GoToWebpageTool.js.map +1 -1
- package/dist/tools/HoverOverElementTool.d.ts.map +1 -1
- package/dist/tools/HoverOverElementTool.js +1 -1
- package/dist/tools/HoverOverElementTool.js.map +1 -1
- package/dist/tools/NavigateWithinStreetView.js +1 -1
- package/dist/tools/NavigateWithinStreetView.js.map +1 -1
- package/dist/tools/PressKeyTool.js +1 -1
- package/dist/tools/PressKeyTool.js.map +1 -1
- package/dist/tools/ReloadPageTool.js +1 -1
- package/dist/tools/ReloadPageTool.js.map +1 -1
- package/dist/tools/ReplayableInteraction.d.ts +16 -1
- package/dist/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/tools/ReplayableInteraction.js +169 -16
- package/dist/tools/ReplayableInteraction.js.map +1 -1
- package/dist/tools/RunAccessibilityTestTool.d.ts +8 -0
- package/dist/tools/RunAccessibilityTestTool.d.ts.map +1 -1
- package/dist/tools/RunAccessibilityTestTool.js +15 -2
- package/dist/tools/RunAccessibilityTestTool.js.map +1 -1
- package/dist/tools/RunInlineJavaScriptCodeTool.d.ts.map +1 -1
- package/dist/tools/RunInlineJavaScriptCodeTool.js +1 -1
- package/dist/tools/RunInlineJavaScriptCodeTool.js.map +1 -1
- package/dist/tools/SaveWebpageAsPdfTool.js +1 -1
- package/dist/tools/SaveWebpageAsPdfTool.js.map +1 -1
- package/dist/tools/ScrollPageTool.d.ts +1 -1
- package/dist/tools/ScrollPageTool.d.ts.map +1 -1
- package/dist/tools/ScrollPageTool.js +47 -4
- package/dist/tools/ScrollPageTool.js.map +1 -1
- package/dist/tools/WaitTool.js +1 -1
- package/dist/tools/WaitTool.js.map +1 -1
- package/dist/utils/MiscUtils.d.ts +2 -2
- package/dist/utils/MiscUtils.js +2 -2
- package/dist/utils/PlaywrightUtils.d.ts +26 -127
- package/dist/utils/PlaywrightUtils.d.ts.map +1 -1
- package/dist/utils/PlaywrightUtils.js +133 -935
- package/dist/utils/PlaywrightUtils.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/clickable-elements-tracker.js +0 -63
- package/dist/assets/zaru-eyes.html +0 -141
- package/dist/esm/assets/clickable-elements-tracker.js +0 -63
- package/dist/esm/assets/zaru-eyes.html +0 -141
- package/dist/esm/managers/TemplateInterpolator.d.ts +0 -19
- package/dist/esm/managers/TemplateInterpolator.d.ts.map +0 -1
- package/dist/esm/managers/TemplateInterpolator.js +0 -86
- package/dist/esm/managers/TemplateInterpolator.js.map +0 -1
- package/dist/esm/managers/ToolTipper.d.ts +0 -32
- package/dist/esm/managers/ToolTipper.d.ts.map +0 -1
- package/dist/esm/managers/ToolTipper.js +0 -229
- package/dist/esm/managers/ToolTipper.js.map +0 -1
- package/dist/esm/models/BrowserState.d.ts +0 -26
- package/dist/esm/models/BrowserState.d.ts.map +0 -1
- package/dist/esm/models/BrowserState.js +0 -3
- package/dist/esm/models/BrowserState.js.map +0 -1
- package/dist/esm/models/ResolverContext.d.ts +0 -7
- package/dist/esm/models/ResolverContext.d.ts.map +0 -1
- package/dist/esm/models/ResolverContext.js +0 -3
- package/dist/esm/models/ResolverContext.js.map +0 -1
- package/dist/esm/models/ToolTemplateDataSource.d.ts +0 -36
- package/dist/esm/models/ToolTemplateDataSource.d.ts.map +0 -1
- package/dist/esm/models/ToolTemplateDataSource.js +0 -3
- package/dist/esm/models/ToolTemplateDataSource.js.map +0 -1
- package/dist/esm/test.d.ts +0 -78
- package/dist/esm/test.d.ts.map +0 -1
- package/dist/esm/test.js +0 -423
- package/dist/esm/test.js.map +0 -1
- package/dist/esm/utils/TemplateInterpolator.d.ts +0 -29
- package/dist/esm/utils/TemplateInterpolator.d.ts.map +0 -1
- package/dist/esm/utils/TemplateInterpolator.js +0 -206
- package/dist/esm/utils/TemplateInterpolator.js.map +0 -1
- package/dist/managers/TemplateInterpolator.d.ts +0 -19
- package/dist/managers/TemplateInterpolator.d.ts.map +0 -1
- package/dist/managers/TemplateInterpolator.js +0 -86
- package/dist/managers/TemplateInterpolator.js.map +0 -1
- package/dist/managers/ToolTipper.d.ts +0 -32
- package/dist/managers/ToolTipper.d.ts.map +0 -1
- package/dist/managers/ToolTipper.js +0 -229
- package/dist/managers/ToolTipper.js.map +0 -1
- package/dist/models/BrowserState.d.ts +0 -26
- package/dist/models/BrowserState.d.ts.map +0 -1
- package/dist/models/BrowserState.js +0 -3
- package/dist/models/BrowserState.js.map +0 -1
- package/dist/models/ResolverContext.d.ts +0 -7
- package/dist/models/ResolverContext.d.ts.map +0 -1
- package/dist/models/ResolverContext.js +0 -3
- package/dist/models/ResolverContext.js.map +0 -1
- package/dist/models/ToolTemplateDataSource.d.ts +0 -36
- package/dist/models/ToolTemplateDataSource.d.ts.map +0 -1
- package/dist/models/ToolTemplateDataSource.js +0 -3
- package/dist/models/ToolTemplateDataSource.js.map +0 -1
- package/dist/test.d.ts +0 -78
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -423
- package/dist/test.js.map +0 -1
- package/dist/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/utils/TemplateInterpolator.d.ts +0 -29
- package/dist/utils/TemplateInterpolator.d.ts.map +0 -1
- package/dist/utils/TemplateInterpolator.js +0 -211
- package/dist/utils/TemplateInterpolator.js.map +0 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
// interactive-elements-tracker.js
|
|
2
|
+
(() => {
|
|
3
|
+
// Store all elements deemed to be interactive
|
|
4
|
+
const interactiveElements = new Set();
|
|
5
|
+
|
|
6
|
+
// Original method references for monkey patching
|
|
7
|
+
const originalAddEventListener = EventTarget.prototype.addEventListener;
|
|
8
|
+
const originalRemoveEventListener = EventTarget.prototype.removeEventListener;
|
|
9
|
+
|
|
10
|
+
// Events that indicate interactivity
|
|
11
|
+
const pointerEvents = [
|
|
12
|
+
'click',
|
|
13
|
+
'mousedown',
|
|
14
|
+
'pointerdown',
|
|
15
|
+
'mouseup',
|
|
16
|
+
'pointerup',
|
|
17
|
+
'touchstart',
|
|
18
|
+
'focus',
|
|
19
|
+
'blur',
|
|
20
|
+
'change',
|
|
21
|
+
'input',
|
|
22
|
+
'submit',
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
// Helper function to check if an element is in shadow DOM
|
|
26
|
+
const isInShadowDOM = (element) => {
|
|
27
|
+
return (
|
|
28
|
+
element instanceof Element && element.getRootNode() instanceof ShadowRoot
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Function to check if an element has interactive CSS properties
|
|
33
|
+
const hasInteractiveStyling = (element) => {
|
|
34
|
+
if (!(element instanceof Element)) return false;
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const computedStyle = window.getComputedStyle(element);
|
|
38
|
+
|
|
39
|
+
// Check for style properties that suggest interactivity
|
|
40
|
+
return (
|
|
41
|
+
computedStyle.cursor === 'pointer' ||
|
|
42
|
+
computedStyle.cursor === 'hand' ||
|
|
43
|
+
element.getAttribute('role') === 'button' ||
|
|
44
|
+
element.getAttribute('role') === 'link' ||
|
|
45
|
+
element.getAttribute('aria-haspopup') === 'true' ||
|
|
46
|
+
element.getAttribute('tabindex') === '0' ||
|
|
47
|
+
element.getAttribute('contenteditable') === 'true'
|
|
48
|
+
);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
return false; // Handle potential errors in computed style
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Function to check for React-specific attributes that suggest interactivity
|
|
55
|
+
const hasReactInteractiveProps = (element) => {
|
|
56
|
+
if (!(element instanceof Element)) return false;
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// Check for React event handler attributes and data attributes
|
|
60
|
+
const reactEventAttrs = [
|
|
61
|
+
'data-donobu-interactable',
|
|
62
|
+
'onClick',
|
|
63
|
+
'onMouseDown',
|
|
64
|
+
'onMouseUp',
|
|
65
|
+
'onPointerDown',
|
|
66
|
+
'onPointerUp',
|
|
67
|
+
'onTouchStart',
|
|
68
|
+
'onChange',
|
|
69
|
+
'onInput',
|
|
70
|
+
'onFocus',
|
|
71
|
+
'onBlur',
|
|
72
|
+
'onSubmit',
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
// Check for React component CSS classes that suggest interactivity
|
|
76
|
+
const interactiveClasses = [
|
|
77
|
+
'cursor-pointer',
|
|
78
|
+
'hover:bg-', // Common Tailwind hover classes
|
|
79
|
+
'active:bg-',
|
|
80
|
+
'focus:outline-',
|
|
81
|
+
'hover:text-',
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
// Check for attributes
|
|
85
|
+
for (const attr of reactEventAttrs) {
|
|
86
|
+
if (
|
|
87
|
+
element.hasAttribute(attr) ||
|
|
88
|
+
element.getAttribute(attr.toLowerCase()) !== null ||
|
|
89
|
+
(element.dataset && attr in element.dataset)
|
|
90
|
+
) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Check for class names suggesting interactivity
|
|
96
|
+
const className = element.className || '';
|
|
97
|
+
if (typeof className === 'string') {
|
|
98
|
+
for (const cls of interactiveClasses) {
|
|
99
|
+
if (className.includes(cls)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return false;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
return false; // Handle any potential errors
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// Monkey patch addEventListener to track elements with event listeners
|
|
112
|
+
EventTarget.prototype.addEventListener = function (type, listener, options) {
|
|
113
|
+
if (pointerEvents.includes(type) && this !== window && this !== document) {
|
|
114
|
+
interactiveElements.add(this);
|
|
115
|
+
|
|
116
|
+
// If this element is in shadow DOM, ensure it's accessible
|
|
117
|
+
if (isInShadowDOM(this)) {
|
|
118
|
+
try {
|
|
119
|
+
const shadowRoot = this.getRootNode();
|
|
120
|
+
if (shadowRoot.host) {
|
|
121
|
+
interactiveElements.add(shadowRoot.host);
|
|
122
|
+
}
|
|
123
|
+
} catch (error) {
|
|
124
|
+
// Ignore errors if getRootNode fails
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return originalAddEventListener.call(this, type, listener, options);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// Restore original removeEventListener behavior
|
|
132
|
+
EventTarget.prototype.removeEventListener = function (
|
|
133
|
+
type,
|
|
134
|
+
listener,
|
|
135
|
+
options,
|
|
136
|
+
) {
|
|
137
|
+
if (pointerEvents.includes(type) && this !== window && this !== document) {
|
|
138
|
+
interactiveElements.delete(this);
|
|
139
|
+
}
|
|
140
|
+
return originalRemoveEventListener.call(this, type, listener, options);
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
// Scan DOM for potentially interactive elements
|
|
144
|
+
const scanForInteractiveElements = () => {
|
|
145
|
+
try {
|
|
146
|
+
// Common interactive element selectors
|
|
147
|
+
const interactiveSelectors = [
|
|
148
|
+
'a',
|
|
149
|
+
'button',
|
|
150
|
+
'input',
|
|
151
|
+
'select',
|
|
152
|
+
'textarea',
|
|
153
|
+
'summary',
|
|
154
|
+
'[role="button"]',
|
|
155
|
+
'[role="link"]',
|
|
156
|
+
'[role="menuitem"]',
|
|
157
|
+
'[role="tab"]',
|
|
158
|
+
'[tabindex]',
|
|
159
|
+
'[contenteditable="true"]',
|
|
160
|
+
'[data-donobu-interactable]',
|
|
161
|
+
'.cursor-pointer',
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
// Only proceed if document is available
|
|
165
|
+
if (document && document.body) {
|
|
166
|
+
// Query for potential interactive elements
|
|
167
|
+
const potentialElements = document.querySelectorAll(
|
|
168
|
+
interactiveSelectors.join(','),
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
potentialElements.forEach((element) => {
|
|
172
|
+
// Add element if it has interactive styling or React props
|
|
173
|
+
if (
|
|
174
|
+
hasInteractiveStyling(element) ||
|
|
175
|
+
hasReactInteractiveProps(element)
|
|
176
|
+
) {
|
|
177
|
+
interactiveElements.add(element);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Handle shadow DOM
|
|
182
|
+
document.querySelectorAll('*').forEach((element) => {
|
|
183
|
+
if (element.shadowRoot) {
|
|
184
|
+
try {
|
|
185
|
+
const shadowElements = element.shadowRoot.querySelectorAll(
|
|
186
|
+
interactiveSelectors.join(','),
|
|
187
|
+
);
|
|
188
|
+
shadowElements.forEach((shadowEl) => {
|
|
189
|
+
if (
|
|
190
|
+
hasInteractiveStyling(shadowEl) ||
|
|
191
|
+
hasReactInteractiveProps(shadowEl)
|
|
192
|
+
) {
|
|
193
|
+
interactiveElements.add(shadowEl);
|
|
194
|
+
interactiveElements.add(element); // Add the host element as well
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
} catch (error) {
|
|
198
|
+
// Continue if there's an error with a particular shadow root
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.error('Error scanning for interactive elements:', error);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// Initialize MutationObserver safely
|
|
209
|
+
let observer = null;
|
|
210
|
+
|
|
211
|
+
const initializeMutationObserver = () => {
|
|
212
|
+
if (!document || !document.body) return;
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
observer = new MutationObserver((mutations) => {
|
|
216
|
+
let shouldRescan = false;
|
|
217
|
+
|
|
218
|
+
for (const mutation of mutations) {
|
|
219
|
+
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
|
|
220
|
+
shouldRescan = true;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (shouldRescan) {
|
|
226
|
+
scanForInteractiveElements();
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// Start observing the document body
|
|
231
|
+
observer.observe(document.body, {
|
|
232
|
+
childList: true,
|
|
233
|
+
subtree: true,
|
|
234
|
+
});
|
|
235
|
+
} catch (error) {
|
|
236
|
+
console.error('Error initializing MutationObserver:', error);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
if (!window.__donobu) {
|
|
241
|
+
Object.defineProperty(window, '__donobu', {
|
|
242
|
+
value: {},
|
|
243
|
+
enumerable: false,
|
|
244
|
+
writable: true,
|
|
245
|
+
configurable: false,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Add components without overwriting the namespace
|
|
250
|
+
if (!window.__donobu.getInteractiveElements) {
|
|
251
|
+
Object.defineProperty(window.__donobu, 'getInteractiveElements', {
|
|
252
|
+
value: () => {
|
|
253
|
+
// Trigger a scan to ensure we have the latest elements
|
|
254
|
+
scanForInteractiveElements();
|
|
255
|
+
|
|
256
|
+
const allInteractiveElements = [];
|
|
257
|
+
|
|
258
|
+
interactiveElements.forEach((element) => {
|
|
259
|
+
if (element instanceof Element) {
|
|
260
|
+
allInteractiveElements.push(element);
|
|
261
|
+
|
|
262
|
+
// Include shadow DOM elements
|
|
263
|
+
if (element.shadowRoot) {
|
|
264
|
+
try {
|
|
265
|
+
const shadowElements = Array.from(
|
|
266
|
+
element.shadowRoot.querySelectorAll('*'),
|
|
267
|
+
).filter((el) => interactiveElements.has(el));
|
|
268
|
+
|
|
269
|
+
allInteractiveElements.push(...shadowElements);
|
|
270
|
+
} catch (error) {
|
|
271
|
+
// Continue if there's an error with a particular shadow element
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
return allInteractiveElements;
|
|
278
|
+
},
|
|
279
|
+
enumerable: false,
|
|
280
|
+
writable: false,
|
|
281
|
+
configurable: false,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (!window.__donobu.debugInteractiveElement) {
|
|
286
|
+
Object.defineProperty(window.__donobu, 'debugInteractiveElement', {
|
|
287
|
+
value: (element) => {
|
|
288
|
+
if (!(element instanceof Element)) {
|
|
289
|
+
return { isInteractive: false, reason: 'Not a DOM element' };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const reasons = [];
|
|
293
|
+
|
|
294
|
+
if (hasInteractiveStyling(element)) {
|
|
295
|
+
reasons.push('Has interactive CSS styling');
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (hasReactInteractiveProps(element)) {
|
|
299
|
+
reasons.push('Has React interactive props or classes');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Check common interactive elements
|
|
303
|
+
if (
|
|
304
|
+
element.tagName === 'A' ||
|
|
305
|
+
element.tagName === 'BUTTON' ||
|
|
306
|
+
element.tagName === 'INPUT' ||
|
|
307
|
+
element.tagName === 'SELECT'
|
|
308
|
+
) {
|
|
309
|
+
reasons.push(`Is a ${element.tagName} element`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Check if element has an explicit event listener
|
|
313
|
+
if (interactiveElements.has(element)) {
|
|
314
|
+
reasons.push('Has registered event listener');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return {
|
|
318
|
+
isInteractive: reasons.length > 0,
|
|
319
|
+
reasons: reasons,
|
|
320
|
+
};
|
|
321
|
+
},
|
|
322
|
+
enumerable: false,
|
|
323
|
+
writable: false,
|
|
324
|
+
configurable: false,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Initialize things safely after DOM content is loaded
|
|
329
|
+
const initialize = () => {
|
|
330
|
+
scanForInteractiveElements();
|
|
331
|
+
initializeMutationObserver();
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
// Set up a safer initialization approach
|
|
335
|
+
if (document.readyState === 'loading') {
|
|
336
|
+
document.addEventListener('DOMContentLoaded', initialize);
|
|
337
|
+
} else {
|
|
338
|
+
// DOM already ready, initialize now
|
|
339
|
+
initialize();
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Periodically scan for interactive elements (React/SPA behavior)
|
|
343
|
+
const rescanInterval = 2000; // milliseconds
|
|
344
|
+
setInterval(() => {
|
|
345
|
+
try {
|
|
346
|
+
scanForInteractiveElements();
|
|
347
|
+
} catch (error) {
|
|
348
|
+
console.error('Error during periodic scan:', error);
|
|
349
|
+
}
|
|
350
|
+
}, rescanInterval);
|
|
351
|
+
})();
|
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Donobu script for tracking interactions with the current page. This scripts assumes the
|
|
3
3
|
* following:
|
|
4
|
-
* 1. There is an exposed binding to call back to
|
|
5
|
-
* 2. The smart-selector-generator.js script has defined the "
|
|
4
|
+
* 1. There is an exposed binding to call back to NodeJS named "__donobuTrackInteraction".
|
|
5
|
+
* 2. The smart-selector-generator.js script has defined the "__donobu.generateSmartSelectors"
|
|
6
6
|
* method on the window object.
|
|
7
7
|
*/
|
|
8
8
|
(() => {
|
|
9
|
-
if (window.
|
|
10
|
-
|
|
9
|
+
if (!window.__donobu) {
|
|
10
|
+
Object.defineProperty(window, '__donobu', {
|
|
11
|
+
value: {},
|
|
12
|
+
enumerable: false,
|
|
13
|
+
writable: true,
|
|
14
|
+
configurable: false,
|
|
15
|
+
});
|
|
11
16
|
}
|
|
12
17
|
|
|
13
|
-
window.
|
|
18
|
+
if (!window.__donobu.interactionListenersRegistered) {
|
|
19
|
+
Object.defineProperty(window.__donobu, 'interactionListenersRegistered', {
|
|
20
|
+
value: true,
|
|
21
|
+
enumerable: false,
|
|
22
|
+
writable: false,
|
|
23
|
+
configurable: false,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!window.__donobu.startDragPosition) {
|
|
28
|
+
Object.defineProperty(window.__donobu, 'startDragPosition', {
|
|
29
|
+
value: { x: 0, y: 0 },
|
|
30
|
+
enumerable: false,
|
|
31
|
+
writable: true,
|
|
32
|
+
configurable: false,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
14
35
|
|
|
15
36
|
// Helper function to check if an event target is inside the Donobu control panel.
|
|
16
37
|
const isDonobuControlPanelInteraction = (element) => {
|
|
@@ -40,20 +61,20 @@
|
|
|
40
61
|
type: eventType,
|
|
41
62
|
x: e.clientX,
|
|
42
63
|
y: e.clientY,
|
|
43
|
-
selectors: window.
|
|
64
|
+
selectors: window.__donobu.generateSmartSelectors(e.target),
|
|
44
65
|
timestamp: new Date().getTime(),
|
|
45
66
|
};
|
|
46
67
|
|
|
47
68
|
if (eventType === 'mousedown') {
|
|
48
|
-
|
|
69
|
+
window.__donobu.startDragPosition = { x: e.clientX, y: e.clientY };
|
|
49
70
|
} else if (eventType === 'mouseup') {
|
|
50
71
|
eventData.dragDistance = Math.sqrt(
|
|
51
|
-
Math.pow(e.clientX -
|
|
52
|
-
Math.pow(e.clientY -
|
|
72
|
+
Math.pow(e.clientX - window.__donobu.startDragPosition.x, 2) +
|
|
73
|
+
Math.pow(e.clientY - window.__donobu.startDragPosition.y, 2),
|
|
53
74
|
);
|
|
54
75
|
}
|
|
55
76
|
|
|
56
|
-
|
|
77
|
+
__donobuTrackInteraction(eventData);
|
|
57
78
|
},
|
|
58
79
|
true,
|
|
59
80
|
);
|
|
@@ -70,7 +91,7 @@
|
|
|
70
91
|
return;
|
|
71
92
|
}
|
|
72
93
|
|
|
73
|
-
|
|
94
|
+
__donobuTrackInteraction({
|
|
74
95
|
type: eventType,
|
|
75
96
|
key: e.key,
|
|
76
97
|
keyCode: e.keyCode,
|
|
@@ -78,7 +99,7 @@
|
|
|
78
99
|
ctrlKey: e.ctrlKey,
|
|
79
100
|
metaKey: e.metaKey,
|
|
80
101
|
shiftKey: e.shiftKey,
|
|
81
|
-
selectors: window.
|
|
102
|
+
selectors: window.__donobu.generateSmartSelectors(e.target),
|
|
82
103
|
timestamp: new Date().getTime(),
|
|
83
104
|
});
|
|
84
105
|
},
|
|
@@ -98,7 +119,7 @@
|
|
|
98
119
|
|
|
99
120
|
const eventData = {
|
|
100
121
|
type: eventType,
|
|
101
|
-
selectors: window.
|
|
122
|
+
selectors: window.__donobu.generateSmartSelectors(e.target),
|
|
102
123
|
timestamp: new Date().getTime(),
|
|
103
124
|
};
|
|
104
125
|
|
|
@@ -115,7 +136,7 @@
|
|
|
115
136
|
}
|
|
116
137
|
}
|
|
117
138
|
|
|
118
|
-
|
|
139
|
+
__donobuTrackInteraction(eventData);
|
|
119
140
|
},
|
|
120
141
|
true,
|
|
121
142
|
);
|
|
@@ -127,7 +148,7 @@
|
|
|
127
148
|
// window.addEventListener(
|
|
128
149
|
// "scroll",
|
|
129
150
|
// function (e) {
|
|
130
|
-
//
|
|
151
|
+
// __donobuTrackInteraction({
|
|
131
152
|
// type: "scroll",
|
|
132
153
|
// scrollX: window.scrollX,
|
|
133
154
|
// scrollY: window.scrollY,
|
|
@@ -141,7 +162,7 @@
|
|
|
141
162
|
// window.addEventListener(
|
|
142
163
|
// "resize",
|
|
143
164
|
// function (e) {
|
|
144
|
-
//
|
|
165
|
+
// __donobuTrackInteraction({
|
|
145
166
|
// type: "resize",
|
|
146
167
|
// width: window.innerWidth,
|
|
147
168
|
// height: window.innerHeight,
|
|
@@ -168,10 +189,10 @@
|
|
|
168
189
|
identifier: touch.identifier,
|
|
169
190
|
}));
|
|
170
191
|
|
|
171
|
-
|
|
192
|
+
__donobuTrackInteraction({
|
|
172
193
|
type: eventType,
|
|
173
194
|
touches: touches,
|
|
174
|
-
selectors: window.
|
|
195
|
+
selectors: window.__donobu.generateSmartSelectors(e.target),
|
|
175
196
|
timestamp: new Date().getTime(),
|
|
176
197
|
});
|
|
177
198
|
},
|
|
@@ -179,6 +200,4 @@
|
|
|
179
200
|
);
|
|
180
201
|
},
|
|
181
202
|
);
|
|
182
|
-
|
|
183
|
-
window.donobuListenersRegistered = true;
|
|
184
203
|
})();
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
(() => {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
if (!window.__donobu) {
|
|
3
|
+
Object.defineProperty(window, '__donobu', {
|
|
4
|
+
value: {},
|
|
5
|
+
enumerable: false,
|
|
6
|
+
writable: true,
|
|
7
|
+
configurable: false,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (!window.__donobu.cssEscape) {
|
|
12
|
+
// Prevent sneaky websites from undefining the CSS escape function.
|
|
13
|
+
// We run first and we can save the CSS escape function.
|
|
14
|
+
Object.defineProperty(window.__donobu, 'cssEscape', {
|
|
15
|
+
value: CSS.escape,
|
|
16
|
+
enumerable: false,
|
|
17
|
+
writable: false,
|
|
18
|
+
configurable: false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
6
21
|
|
|
7
22
|
class SelectorToCount {
|
|
8
23
|
constructor(selector) {
|
|
@@ -118,7 +133,8 @@
|
|
|
118
133
|
return null;
|
|
119
134
|
}
|
|
120
135
|
})
|
|
121
|
-
.filter((a) => a !== null
|
|
136
|
+
.filter((a) => a !== null)
|
|
137
|
+
.filter((a) => a.count !== 0)
|
|
122
138
|
.sort((a, b) => {
|
|
123
139
|
// 1. fewer matches -> better
|
|
124
140
|
if (a.count !== b.count) return a.count - b.count;
|
|
@@ -235,7 +251,7 @@
|
|
|
235
251
|
if (id) {
|
|
236
252
|
const label = document.querySelector(`label[for='${id}']`);
|
|
237
253
|
if (label) {
|
|
238
|
-
const labelText = label.textContent
|
|
254
|
+
const labelText = label.textContent?.trim();
|
|
239
255
|
if (labelText) {
|
|
240
256
|
const safeLabelText = xpathLiteral(labelText);
|
|
241
257
|
return [
|
|
@@ -311,16 +327,23 @@
|
|
|
311
327
|
}
|
|
312
328
|
|
|
313
329
|
escapeCss(str) {
|
|
314
|
-
return window.
|
|
330
|
+
return window.__donobu.cssEscape(str);
|
|
315
331
|
}
|
|
316
332
|
}
|
|
317
333
|
|
|
318
|
-
window.
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
334
|
+
if (!window.__donobu.generateSmartSelectors) {
|
|
335
|
+
Object.defineProperty(window.__donobu, 'generateSmartSelectors', {
|
|
336
|
+
value: (element) => {
|
|
337
|
+
try {
|
|
338
|
+
return new SelectorGenerator(element).generate();
|
|
339
|
+
} catch (e) {
|
|
340
|
+
console.warn('Exception while generating selector', e);
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
enumerable: false,
|
|
345
|
+
writable: false,
|
|
346
|
+
configurable: false,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
326
349
|
})();
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { FocusedPage } from '../models/FocusedPage';
|
|
2
2
|
import { NamedBindingCallback } from './NamedBindingCallback';
|
|
3
3
|
import { BrowserContext, Page, Frame } from 'playwright';
|
|
4
|
+
declare global {
|
|
5
|
+
interface Window {
|
|
6
|
+
[FocusPage.NAME]: () => void;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
4
9
|
/**
|
|
5
10
|
* A binding that brings the page executing this callback into focus.
|
|
6
11
|
*/
|
|
@@ -13,6 +18,6 @@ export declare class FocusPage implements NamedBindingCallback {
|
|
|
13
18
|
context: BrowserContext;
|
|
14
19
|
page: Page;
|
|
15
20
|
frame: Frame;
|
|
16
|
-
}, ...
|
|
21
|
+
}, ..._args: any[]): void;
|
|
17
22
|
}
|
|
18
23
|
//# sourceMappingURL=FocusPage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FocusPage.d.ts","sourceRoot":"","sources":["../../../src/bindings/FocusPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,qBAAa,SAAU,YAAW,oBAAoB;IAGjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAF/C,gBAAuB,IAAI,qBAAqB;gBAEZ,WAAW,EAAE,WAAW;IAErD,IAAI,IAAI,MAAM;IAId,IAAI,CACT,MAAM,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAC7D,GAAG,
|
|
1
|
+
{"version":3,"file":"FocusPage.d.ts","sourceRoot":"","sources":["../../../src/bindings/FocusPage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;KAC9B;CACF;AAED;;GAEG;AACH,qBAAa,SAAU,YAAW,oBAAoB;IAGjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAF/C,gBAAuB,IAAI,qBAAqB;gBAEZ,WAAW,EAAE,WAAW;IAErD,IAAI,IAAI,MAAM;IAId,IAAI,CACT,MAAM,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAC7D,GAAG,KAAK,EAAE,GAAG,EAAE,GACd,IAAI;CAGR"}
|
|
@@ -11,14 +11,8 @@ class FocusPage {
|
|
|
11
11
|
name() {
|
|
12
12
|
return FocusPage.NAME;
|
|
13
13
|
}
|
|
14
|
-
call(source, ...
|
|
15
|
-
|
|
16
|
-
const page = source.context.pages().find((tab) => tab.url() === tabUrl);
|
|
17
|
-
if (page) {
|
|
18
|
-
this.focusedPage.current = page;
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
return false;
|
|
14
|
+
call(source, ..._args) {
|
|
15
|
+
this.focusedPage.current = source.page;
|
|
22
16
|
}
|
|
23
17
|
}
|
|
24
18
|
exports.FocusPage = FocusPage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FocusPage.js","sourceRoot":"","sources":["../../../src/bindings/FocusPage.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"FocusPage.js","sourceRoot":"","sources":["../../../src/bindings/FocusPage.ts"],"names":[],"mappings":";;;AAUA;;GAEG;AACH,MAAa,SAAS;IAGpB,YAAoC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAEzD,IAAI;QACT,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;IAEM,IAAI,CACT,MAA6D,EAC7D,GAAG,KAAY;QAEf,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IACzC,CAAC;;AAdH,8BAeC;AAdwB,cAAI,GAAG,iBAAiB,CAAC"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { BrowserContext, Page, Frame } from 'playwright';
|
|
2
2
|
import { NamedBindingCallback } from './NamedBindingCallback';
|
|
3
3
|
import { DonobuFlow } from '../managers/DonobuFlow';
|
|
4
|
+
declare global {
|
|
5
|
+
interface Window {
|
|
6
|
+
[PageInteractionTracker.NAME]: () => boolean;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
4
9
|
/**
|
|
5
10
|
* Tracks direct user actions that have occurred in the web browser.
|
|
6
11
|
* This differs from normal Donobu flows which use GPT to analyze pages and propose actions.
|
|
@@ -8,8 +13,10 @@ import { DonobuFlow } from '../managers/DonobuFlow';
|
|
|
8
13
|
*/
|
|
9
14
|
export declare class PageInteractionTracker implements NamedBindingCallback {
|
|
10
15
|
private readonly donobuFlow;
|
|
11
|
-
static readonly
|
|
12
|
-
|
|
16
|
+
private static readonly INIT_SCRIPT;
|
|
17
|
+
static readonly NAME = "__donobuTrackInteraction";
|
|
18
|
+
static register(donobuFlow: DonobuFlow, browserContext: BrowserContext): Promise<PageInteractionTracker>;
|
|
19
|
+
private constructor();
|
|
13
20
|
name(): string;
|
|
14
21
|
/**
|
|
15
22
|
* Handles tracking of page interactions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageInteractionTracker.d.ts","sourceRoot":"","sources":["../../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"PageInteractionTracker.d.ts","sourceRoot":"","sources":["../../../src/bindings/PageInteractionTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAgBpD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC;KAC9C;CACF;AAQD;;;;GAIG;AACH,qBAAa,sBAAuB,YAAW,oBAAoB;IAqC7C,OAAO,CAAC,QAAQ,CAAC,UAAU;IApC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAEjC;IAGF,gBAAuB,IAAI,8BAA8B;WAErC,QAAQ,CAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IA0BlC,OAAO;IAEA,IAAI,IAAI,MAAM;IAIrB;;;;;OAKG;IACU,IAAI,CACf,MAAM,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,EAC7D,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;YAkDF,cAAc;CAyD7B"}
|