@btraut/browser-bridge 0.14.0 → 0.15.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 +30 -0
- package/README.md +27 -2
- package/dist/api.js +893 -166
- package/dist/api.js.map +4 -4
- package/dist/index.js +349 -115
- package/dist/index.js.map +4 -4
- package/extension/dist/background.js +468 -18
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/content.js +71 -8
- package/extension/dist/content.js.map +2 -2
- package/extension/dist/permissions-request-ui.js +111 -0
- package/extension/dist/permissions-request-ui.js.map +7 -0
- package/extension/manifest.json +2 -2
- package/package.json +1 -1
- package/skills/browser-bridge/SKILL.md +9 -0
- package/skills/browser-bridge/skill.json +1 -1
|
@@ -228,6 +228,16 @@
|
|
|
228
228
|
var getRoleAccessibleName = (element) => normalizeText(
|
|
229
229
|
element.getAttribute("aria-label") ?? element.getAttribute("title") ?? getRenderedText(element)
|
|
230
230
|
);
|
|
231
|
+
var getActionabilityScore = (element) => {
|
|
232
|
+
if (!(element instanceof HTMLElement) || !isVisible(element)) {
|
|
233
|
+
return { directHit: false, hittable: false };
|
|
234
|
+
}
|
|
235
|
+
const point = getHittablePoint(element, { preferDirectHit: true });
|
|
236
|
+
return {
|
|
237
|
+
directHit: pointHitsTarget(element, point.x, point.y, { directOnly: true }),
|
|
238
|
+
hittable: pointHitsTarget(element, point.x, point.y)
|
|
239
|
+
};
|
|
240
|
+
};
|
|
231
241
|
var scoreCandidates = (candidates, options) => {
|
|
232
242
|
const queryText = options?.exactText ? normalizeText(options.exactText) : "";
|
|
233
243
|
const queryHref = options?.exactHref ?? "";
|
|
@@ -236,11 +246,15 @@
|
|
|
236
246
|
}
|
|
237
247
|
const scored = candidates.filter(isVisible).map((candidate) => {
|
|
238
248
|
const text = getRenderedText(candidate);
|
|
249
|
+
const accessibleName = getRoleAccessibleName(candidate);
|
|
239
250
|
const href = candidate.getAttribute("href") ?? "";
|
|
251
|
+
const actionability = getActionabilityScore(candidate);
|
|
240
252
|
return {
|
|
241
253
|
candidate,
|
|
242
|
-
exactText: queryText.length > 0 && text === queryText,
|
|
254
|
+
exactText: queryText.length > 0 && (text === queryText || accessibleName === queryText),
|
|
243
255
|
exactHref: queryHref.length > 0 && (href === queryHref || candidate instanceof HTMLAnchorElement && candidate.href === queryHref),
|
|
256
|
+
directHit: actionability.directHit,
|
|
257
|
+
hittable: actionability.hittable,
|
|
244
258
|
onScreen: isOnScreen(candidate),
|
|
245
259
|
clickable: isClickable(candidate),
|
|
246
260
|
textLength: text.length,
|
|
@@ -253,6 +267,12 @@
|
|
|
253
267
|
if (a.exactText !== b.exactText) {
|
|
254
268
|
return a.exactText ? -1 : 1;
|
|
255
269
|
}
|
|
270
|
+
if (a.directHit !== b.directHit) {
|
|
271
|
+
return a.directHit ? -1 : 1;
|
|
272
|
+
}
|
|
273
|
+
if (a.hittable !== b.hittable) {
|
|
274
|
+
return a.hittable ? -1 : 1;
|
|
275
|
+
}
|
|
256
276
|
if (a.onScreen !== b.onScreen) {
|
|
257
277
|
return a.onScreen ? -1 : 1;
|
|
258
278
|
}
|
|
@@ -299,14 +319,17 @@
|
|
|
299
319
|
}
|
|
300
320
|
const preferredText = getRenderedText(preferredTarget);
|
|
301
321
|
const currentBest = candidateMap.get(preferredTarget);
|
|
322
|
+
const actionability = getActionabilityScore(preferredTarget);
|
|
302
323
|
const nextScore = {
|
|
303
324
|
exact: preferredText === query || elementText === query,
|
|
325
|
+
directHit: actionability.directHit,
|
|
326
|
+
hittable: actionability.hittable,
|
|
304
327
|
onScreen: isOnScreen(preferredTarget),
|
|
305
328
|
clickable: isClickable(preferredTarget),
|
|
306
329
|
textLength: preferredText.length || elementText.length,
|
|
307
330
|
depth: getNodeDepth(preferredTarget)
|
|
308
331
|
};
|
|
309
|
-
if (!currentBest || Number(nextScore.exact) > Number(currentBest.exact) || nextScore.exact === currentBest.exact && Number(nextScore.onScreen) > Number(currentBest.onScreen) || nextScore.exact === currentBest.exact && nextScore.onScreen === currentBest.onScreen && Number(nextScore.clickable) > Number(currentBest.clickable) || nextScore.exact === currentBest.exact && nextScore.onScreen === currentBest.onScreen && nextScore.clickable === currentBest.clickable && nextScore.textLength < currentBest.textLength || nextScore.exact === currentBest.exact && nextScore.onScreen === currentBest.onScreen && nextScore.clickable === currentBest.clickable && nextScore.textLength === currentBest.textLength && nextScore.depth > currentBest.depth) {
|
|
332
|
+
if (!currentBest || Number(nextScore.exact) > Number(currentBest.exact) || nextScore.exact === currentBest.exact && Number(nextScore.directHit) > Number(currentBest.directHit) || nextScore.exact === currentBest.exact && nextScore.directHit === currentBest.directHit && Number(nextScore.hittable) > Number(currentBest.hittable) || nextScore.exact === currentBest.exact && nextScore.directHit === currentBest.directHit && nextScore.hittable === currentBest.hittable && Number(nextScore.onScreen) > Number(currentBest.onScreen) || nextScore.exact === currentBest.exact && nextScore.directHit === currentBest.directHit && nextScore.hittable === currentBest.hittable && nextScore.onScreen === currentBest.onScreen && Number(nextScore.clickable) > Number(currentBest.clickable) || nextScore.exact === currentBest.exact && nextScore.directHit === currentBest.directHit && nextScore.hittable === currentBest.hittable && nextScore.onScreen === currentBest.onScreen && nextScore.clickable === currentBest.clickable && nextScore.textLength < currentBest.textLength || nextScore.exact === currentBest.exact && nextScore.directHit === currentBest.directHit && nextScore.hittable === currentBest.hittable && nextScore.onScreen === currentBest.onScreen && nextScore.clickable === currentBest.clickable && nextScore.textLength === currentBest.textLength && nextScore.depth > currentBest.depth) {
|
|
310
333
|
candidateMap.set(preferredTarget, nextScore);
|
|
311
334
|
}
|
|
312
335
|
node = tree.nextNode();
|
|
@@ -317,6 +340,12 @@
|
|
|
317
340
|
if (left.exact !== right.exact) {
|
|
318
341
|
return left.exact ? -1 : 1;
|
|
319
342
|
}
|
|
343
|
+
if (left.directHit !== right.directHit) {
|
|
344
|
+
return left.directHit ? -1 : 1;
|
|
345
|
+
}
|
|
346
|
+
if (left.hittable !== right.hittable) {
|
|
347
|
+
return left.hittable ? -1 : 1;
|
|
348
|
+
}
|
|
320
349
|
if (left.onScreen !== right.onScreen) {
|
|
321
350
|
return left.onScreen ? -1 : 1;
|
|
322
351
|
}
|
|
@@ -401,6 +430,7 @@
|
|
|
401
430
|
// packages/extension/src/content.ts
|
|
402
431
|
var AGENT_TAB_BRANDING_ACTION = "drive.agent_tab_branding";
|
|
403
432
|
var AGENT_TAB_FAVICON_MARKER_ATTR = "data-bb-agent-favicon";
|
|
433
|
+
var CONTENT_LISTENER_MARKER = "__browserBridgeContentListenerInstalled__";
|
|
404
434
|
var applyAgentTabFavicon = (faviconUrl) => {
|
|
405
435
|
if (faviconUrl.length === 0) {
|
|
406
436
|
return;
|
|
@@ -504,15 +534,40 @@
|
|
|
504
534
|
const matching = candidates.filter(
|
|
505
535
|
(candidate) => getRoleAccessibleName(candidate).includes(query)
|
|
506
536
|
);
|
|
507
|
-
if (matching.length
|
|
537
|
+
if (matching.length > 0) {
|
|
538
|
+
const exactMatches = matching.filter(
|
|
539
|
+
(candidate) => getRoleAccessibleName(candidate) === query
|
|
540
|
+
);
|
|
541
|
+
return scoreCandidates(
|
|
542
|
+
exactMatches.length > 0 ? exactMatches : matching,
|
|
543
|
+
{
|
|
544
|
+
exactText: query
|
|
545
|
+
}
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
const fallbackCandidates = Array.from(
|
|
549
|
+
document.querySelectorAll("*")
|
|
550
|
+
).filter((candidate) => {
|
|
551
|
+
if (!isVisible(candidate)) {
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
if (roleName === "button" && !isClickable(candidate)) {
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
return getRoleAccessibleName(candidate).includes(query);
|
|
558
|
+
});
|
|
559
|
+
if (fallbackCandidates.length === 0) {
|
|
508
560
|
return null;
|
|
509
561
|
}
|
|
510
|
-
const
|
|
562
|
+
const exactFallbackMatches = fallbackCandidates.filter(
|
|
511
563
|
(candidate) => getRoleAccessibleName(candidate) === query
|
|
512
564
|
);
|
|
513
|
-
return scoreCandidates(
|
|
514
|
-
|
|
515
|
-
|
|
565
|
+
return scoreCandidates(
|
|
566
|
+
exactFallbackMatches.length > 0 ? exactFallbackMatches : fallbackCandidates,
|
|
567
|
+
{
|
|
568
|
+
exactText: query
|
|
569
|
+
}
|
|
570
|
+
);
|
|
516
571
|
};
|
|
517
572
|
const resolveLocator = (locator) => {
|
|
518
573
|
if (!locator) {
|
|
@@ -1346,7 +1401,15 @@
|
|
|
1346
1401
|
}
|
|
1347
1402
|
};
|
|
1348
1403
|
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1349
|
-
|
|
1404
|
+
var contentListenerInstalled = (() => {
|
|
1405
|
+
const target = globalThis;
|
|
1406
|
+
if (target[CONTENT_LISTENER_MARKER]) {
|
|
1407
|
+
return true;
|
|
1408
|
+
}
|
|
1409
|
+
target[CONTENT_LISTENER_MARKER] = true;
|
|
1410
|
+
return false;
|
|
1411
|
+
})();
|
|
1412
|
+
if (typeof chrome !== "undefined" && chrome.runtime?.onMessage && !contentListenerInstalled) {
|
|
1350
1413
|
chrome.runtime.onMessage.addListener(
|
|
1351
1414
|
(message, _sender, sendResponse) => {
|
|
1352
1415
|
if (!isRecord(message) || typeof message.action !== "string") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/popup-trigger-state.ts", "../src/click-strategies/index.ts", "../src/click-strategies/generic-click.ts", "../src/click-strategies/popup-trigger-click.ts", "../src/locator-point.ts", "../src/locator-ranking.ts", "../src/snapshot-ref-recovery.ts", "../src/content.ts"],
|
|
4
|
-
"sourcesContent": ["export type PopupTriggerState = {\n kind: 'popup_trigger';\n ariaHasPopup?: string;\n ariaExpanded?: string;\n dataState?: string;\n open?: boolean;\n};\n\nconst normalizeAttr = (value: string | null): string | undefined => {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nexport const readPopupTriggerState = (\n target: Element\n): PopupTriggerState | null => {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n const ariaHasPopup = normalizeAttr(target.getAttribute('aria-haspopup'));\n const ariaExpanded = normalizeAttr(target.getAttribute('aria-expanded'));\n const dataState = normalizeAttr(target.getAttribute('data-state'));\n const open =\n 'open' in target && typeof (target as { open?: unknown }).open === 'boolean'\n ? ((target as { open: boolean }).open ?? false)\n : undefined;\n const qualifiesAsPopupTrigger =\n Boolean(ariaHasPopup) || ariaExpanded !== undefined || open !== undefined;\n if (!qualifiesAsPopupTrigger && dataState === undefined) {\n return null;\n }\n if (!qualifiesAsPopupTrigger) {\n return null;\n }\n return {\n kind: 'popup_trigger',\n ariaHasPopup,\n ariaExpanded,\n dataState,\n open,\n };\n};\n\nexport const popupTriggerStateChanged = (\n before: PopupTriggerState | null,\n after: PopupTriggerState | null\n): boolean => {\n if (!before || !after) {\n return before !== after;\n }\n return (\n before.ariaExpanded !== after.ariaExpanded ||\n before.dataState !== after.dataState ||\n before.open !== after.open\n );\n};\n\nexport const coercePopupTriggerState = (\n value: unknown\n): PopupTriggerState | undefined => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n if (record.kind !== 'popup_trigger') {\n return undefined;\n }\n const ariaHasPopup =\n typeof record.ariaHasPopup === 'string' ? record.ariaHasPopup : undefined;\n const ariaExpanded =\n typeof record.ariaExpanded === 'string' ? record.ariaExpanded : undefined;\n const dataState =\n typeof record.dataState === 'string' ? record.dataState : undefined;\n const open = typeof record.open === 'boolean' ? record.open : undefined;\n return {\n kind: 'popup_trigger',\n ...(ariaHasPopup ? { ariaHasPopup } : {}),\n ...(ariaExpanded !== undefined ? { ariaExpanded } : {}),\n ...(dataState !== undefined ? { dataState } : {}),\n ...(open !== undefined ? { open } : {}),\n };\n};\n", "import {\n readPopupTriggerState,\n type PopupTriggerState,\n} from '../popup-trigger-state.js';\n\nexport type ClickStrategySelection =\n | { kind: 'generic' }\n | { kind: 'popup_trigger'; state: PopupTriggerState };\n\nexport const selectClickStrategy = (\n target: Element\n): ClickStrategySelection => {\n const popupTriggerState = readPopupTriggerState(target);\n if (popupTriggerState) {\n return {\n kind: 'popup_trigger',\n state: popupTriggerState,\n };\n }\n return { kind: 'generic' };\n};\n", "type DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nexport const executeGenericClick = (options: {\n target: Element;\n clickCount: number;\n}): ContentResult => {\n const { target, clickCount } = options;\n // Clicking elements that trigger JS dialogs (alert/confirm/prompt) can block\n // the renderer thread before we can reply to the background script, so defer\n // the actual click to the next tick and acknowledge immediately.\n window.setTimeout(() => {\n try {\n if (target instanceof HTMLElement) {\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n }\n for (let i = 0; i < clickCount; i += 1) {\n (target as HTMLElement).click();\n }\n } catch {\n // Best-effort: the element may have disappeared or navigation occurred.\n }\n }, 0);\n return { ok: true };\n};\n", "import {\n popupTriggerStateChanged,\n readPopupTriggerState,\n type PopupTriggerState,\n} from '../popup-trigger-state.js';\n\ntype DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nexport const executePopupTriggerClick = async (options: {\n target: Element;\n beforeState: PopupTriggerState;\n clickCount: number;\n locationBefore: string;\n sleep: (ms: number) => Promise<void>;\n settleMs?: number;\n}): Promise<ContentResult> => {\n const popupTarget = options.target as HTMLElement;\n try {\n popupTarget.focus({ preventScroll: true });\n } catch {\n popupTarget.focus();\n }\n for (let i = 0; i < options.clickCount; i += 1) {\n popupTarget.click();\n }\n await options.sleep(options.settleMs ?? 50);\n if (\n window.location.href !== options.locationBefore ||\n !options.target.isConnected\n ) {\n return { ok: true };\n }\n const popupTriggerAfter = readPopupTriggerState(options.target);\n if (\n !popupTriggerStateChanged(options.beforeState, popupTriggerAfter ?? null)\n ) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message:\n 'Click focused the popup trigger but did not change its open state.',\n retryable: false,\n details: {\n reason: 'click_state_unchanged',\n control: options.beforeState.kind,\n aria_haspopup: options.beforeState.ariaHasPopup,\n aria_expanded_before: options.beforeState.ariaExpanded,\n aria_expanded_after: popupTriggerAfter?.ariaExpanded,\n data_state_before: options.beforeState.dataState,\n data_state_after: popupTriggerAfter?.dataState,\n },\n },\n };\n }\n return { ok: true };\n};\n", "export const pointHitsTarget = (\n target: Element,\n x: number,\n y: number,\n options?: { directOnly?: boolean }\n): boolean => {\n if (typeof document.elementFromPoint !== 'function') {\n return true;\n }\n const hit = document.elementFromPoint(x, y);\n if (!hit) {\n return false;\n }\n if (options?.directOnly) {\n return target === hit;\n }\n return target === hit || target.contains(hit);\n};\n\nexport const getHittablePoint = (\n target: Element,\n options?: { preferDirectHit?: boolean }\n): { x: number; y: number } => {\n const rect = target.getBoundingClientRect();\n const insetX = Math.min(Math.max(rect.width * 0.25, 1), rect.width / 2);\n const insetY = Math.min(Math.max(rect.height * 0.25, 1), rect.height / 2);\n const candidatePoints = [\n { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 },\n { x: rect.left + insetX, y: rect.top + insetY },\n { x: rect.right - insetX, y: rect.top + insetY },\n { x: rect.left + insetX, y: rect.bottom - insetY },\n { x: rect.right - insetX, y: rect.bottom - insetY },\n { x: rect.left + rect.width / 2, y: rect.top + insetY },\n { x: rect.left + rect.width / 2, y: rect.bottom - insetY },\n { x: rect.left + insetX, y: rect.top + rect.height / 2 },\n { x: rect.right - insetX, y: rect.top + rect.height / 2 },\n ];\n if (options?.preferDirectHit) {\n for (const point of candidatePoints) {\n if (pointHitsTarget(target, point.x, point.y, { directOnly: true })) {\n return point;\n }\n }\n }\n for (const point of candidatePoints) {\n if (pointHitsTarget(target, point.x, point.y)) {\n return point;\n }\n }\n return candidatePoints[0] ?? { x: rect.left, y: rect.top };\n};\n", "const collectVisibleText = (\n node: Node,\n isVisible: (element: Element) => boolean\n): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || '';\n }\n if (!(node instanceof Element)) {\n return '';\n }\n if (!isVisible(node)) {\n return '';\n }\n if (node instanceof HTMLElement) {\n const { innerText } = node;\n if (typeof innerText === 'string' && innerText.length > 0) {\n return innerText;\n }\n }\n return Array.from(node.childNodes)\n .map((child) => collectVisibleText(child, isVisible))\n .join('');\n};\n\nexport const normalizeText = (value: string): string =>\n value.replace(/\\s+/g, ' ').trim();\n\nexport const isClickable = (element: Element): boolean =>\n element instanceof HTMLElement &&\n element.matches(\n 'a,button,input,textarea,select,summary,label,[role=\"button\"],[tabindex]'\n );\n\nexport const getNodeDepth = (element: Element): number => {\n let depth = 0;\n let current: Element | null = element;\n while (current) {\n depth += 1;\n current = current.parentElement;\n }\n return depth;\n};\n\nexport const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n const style = window.getComputedStyle(element);\n if (style.visibility === 'hidden' || style.display === 'none') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n return false;\n }\n if (\n element.offsetWidth === 0 &&\n element.offsetHeight === 0 &&\n element.getClientRects().length === 0\n ) {\n return false;\n }\n let current: HTMLElement | null = element;\n while (current) {\n const currentStyle = window.getComputedStyle(current);\n if (currentStyle.display === 'none') {\n return false;\n }\n if (\n currentStyle.visibility === 'hidden' ||\n currentStyle.visibility === 'collapse'\n ) {\n return false;\n }\n const opacity = Number.parseFloat(currentStyle.opacity ?? '1');\n if (Number.isFinite(opacity) && opacity <= 0) {\n return false;\n }\n current = current.parentElement;\n }\n return true;\n};\n\nexport const isOnScreen = (element: Element): boolean => {\n if (!(element instanceof HTMLElement) || !isVisible(element)) {\n return false;\n }\n const rect = element.getBoundingClientRect();\n return (\n rect.right > 0 &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.top < window.innerHeight\n );\n};\n\nexport const getRenderedText = (element: Element): string =>\n normalizeText(collectVisibleText(element, isVisible));\n\nexport const getRoleAccessibleName = (element: Element): string =>\n normalizeText(\n element.getAttribute('aria-label') ??\n element.getAttribute('title') ??\n getRenderedText(element)\n );\n\nexport const scoreCandidates = (\n candidates: Element[],\n options?: {\n exactText?: string;\n exactHref?: string;\n }\n): Element | null => {\n const queryText = options?.exactText ? normalizeText(options.exactText) : '';\n const queryHref = options?.exactHref ?? '';\n if (candidates.length === 0) {\n return null;\n }\n const scored = candidates\n .filter(isVisible)\n .map((candidate) => {\n const text = getRenderedText(candidate);\n const href = candidate.getAttribute('href') ?? '';\n return {\n candidate,\n exactText: queryText.length > 0 && text === queryText,\n exactHref:\n queryHref.length > 0 &&\n (href === queryHref ||\n (candidate instanceof HTMLAnchorElement &&\n candidate.href === queryHref)),\n onScreen: isOnScreen(candidate),\n clickable: isClickable(candidate),\n textLength: text.length,\n depth: getNodeDepth(candidate),\n };\n })\n .sort((a, b) => {\n if (a.exactHref !== b.exactHref) {\n return a.exactHref ? -1 : 1;\n }\n if (a.exactText !== b.exactText) {\n return a.exactText ? -1 : 1;\n }\n if (a.onScreen !== b.onScreen) {\n return a.onScreen ? -1 : 1;\n }\n if (a.clickable !== b.clickable) {\n return a.clickable ? -1 : 1;\n }\n if (a.textLength !== b.textLength) {\n return a.textLength - b.textLength;\n }\n return b.depth - a.depth;\n });\n return scored[0]?.candidate ?? candidates[0] ?? null;\n};\n\nexport const findByText = (text: string): Element | null => {\n const query = normalizeText(text);\n if (query.length === 0) {\n return null;\n }\n\n const candidateMap = new Map<\n Element,\n {\n exact: boolean;\n onScreen: boolean;\n clickable: boolean;\n textLength: number;\n depth: number;\n }\n >();\n const tree = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_ELEMENT\n );\n let node = tree.nextNode();\n while (node) {\n const element = node as Element;\n if (!isVisible(element)) {\n node = tree.nextNode();\n continue;\n }\n const elementText = getRenderedText(element);\n if (!elementText.includes(query)) {\n node = tree.nextNode();\n continue;\n }\n\n let preferredTarget: Element = element;\n let current: Element | null = element;\n while (current) {\n if (\n current !== element &&\n isVisible(current) &&\n isClickable(current) &&\n getRenderedText(current).includes(query)\n ) {\n preferredTarget = current;\n break;\n }\n current = current.parentElement;\n }\n\n const preferredText = getRenderedText(preferredTarget);\n const currentBest = candidateMap.get(preferredTarget);\n const nextScore = {\n exact: preferredText === query || elementText === query,\n onScreen: isOnScreen(preferredTarget),\n clickable: isClickable(preferredTarget),\n textLength: preferredText.length || elementText.length,\n depth: getNodeDepth(preferredTarget),\n };\n\n if (\n !currentBest ||\n Number(nextScore.exact) > Number(currentBest.exact) ||\n (nextScore.exact === currentBest.exact &&\n Number(nextScore.onScreen) > Number(currentBest.onScreen)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.onScreen === currentBest.onScreen &&\n Number(nextScore.clickable) > Number(currentBest.clickable)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.onScreen === currentBest.onScreen &&\n nextScore.clickable === currentBest.clickable &&\n nextScore.textLength < currentBest.textLength) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.onScreen === currentBest.onScreen &&\n nextScore.clickable === currentBest.clickable &&\n nextScore.textLength === currentBest.textLength &&\n nextScore.depth > currentBest.depth)\n ) {\n candidateMap.set(preferredTarget, nextScore);\n }\n\n node = tree.nextNode();\n }\n\n const candidates = Array.from(candidateMap.entries()).sort((a, b) => {\n const [, left] = a;\n const [, right] = b;\n if (left.exact !== right.exact) {\n return left.exact ? -1 : 1;\n }\n if (left.onScreen !== right.onScreen) {\n return left.onScreen ? -1 : 1;\n }\n if (left.clickable !== right.clickable) {\n return left.clickable ? -1 : 1;\n }\n if (left.textLength !== right.textLength) {\n return left.textLength - right.textLength;\n }\n return right.depth - left.depth;\n });\n\n return candidates[0]?.[0] ?? null;\n};\n", "import { findByText, scoreCandidates } from './locator-ranking.js';\n\nexport const SNAPSHOT_REF_REGISTRY_ID = '__bb_snapshot_ref_registry__';\n\nexport type SnapshotRefMetadata = {\n role?: string;\n name?: string;\n url?: string;\n};\n\nexport const readSnapshotRefRegistry = (): Map<string, SnapshotRefMetadata> => {\n const registry = new Map<string, SnapshotRefMetadata>();\n const el = document.getElementById(SNAPSHOT_REF_REGISTRY_ID);\n const raw = el?.textContent;\n if (!raw) {\n return registry;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return registry;\n }\n for (const entry of parsed) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const ref = (entry as { ref?: unknown }).ref;\n if (typeof ref !== 'string' || ref.length === 0) {\n continue;\n }\n registry.set(ref, {\n role:\n typeof (entry as { role?: unknown }).role === 'string'\n ? ((entry as { role?: string }).role ?? undefined)\n : undefined,\n name:\n typeof (entry as { name?: unknown }).name === 'string'\n ? ((entry as { name?: string }).name ?? undefined)\n : undefined,\n url:\n typeof (entry as { url?: unknown }).url === 'string'\n ? ((entry as { url?: string }).url ?? undefined)\n : undefined,\n });\n }\n } catch {\n return new Map();\n }\n return registry;\n};\n\n// Recovery is deliberately best-effort. We only persist metadata for refs that\n// rebound into the live DOM during snapshot capture, then try to recover in the\n// same order the existing UI proved reliable on rerendered link lists: exact\n// url/text link match first, then role/name, then plain text.\nexport const recoverElementBySnapshotRef = (\n ref: string,\n options: {\n findByRole: (locator: Record<string, unknown>) => Element | null;\n }\n): Element | null => {\n const metadata = readSnapshotRefRegistry().get(ref);\n if (!metadata) {\n return null;\n }\n\n if (typeof metadata.url === 'string' && metadata.url.length > 0) {\n const linkCandidates = Array.from(\n document.querySelectorAll('a[href],[role=\"link\"]')\n );\n const bestLink = scoreCandidates(linkCandidates, {\n exactHref: metadata.url,\n exactText: metadata.name,\n });\n if (bestLink) {\n return bestLink;\n }\n }\n\n if (typeof metadata.role === 'string' && metadata.role.length > 0) {\n const roleMatch = options.findByRole({\n role: {\n name: metadata.role,\n ...(metadata.name ? { value: metadata.name } : {}),\n },\n });\n if (roleMatch) {\n return roleMatch;\n }\n }\n\n if (typeof metadata.name === 'string' && metadata.name.length > 0) {\n return findByText(metadata.name);\n }\n\n return null;\n};\n", "import { readPopupTriggerState } from './popup-trigger-state.js';\nimport { selectClickStrategy } from './click-strategies/index.js';\nimport { executeGenericClick } from './click-strategies/generic-click.js';\nimport { executePopupTriggerClick } from './click-strategies/popup-trigger-click.js';\nimport { getHittablePoint } from './locator-point.js';\nimport {\n findByText,\n getRenderedText,\n getRoleAccessibleName,\n isVisible,\n normalizeText,\n scoreCandidates,\n} from './locator-ranking.js';\nimport { recoverElementBySnapshotRef } from './snapshot-ref-recovery.js';\n\ntype DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nconst AGENT_TAB_BRANDING_ACTION = 'drive.agent_tab_branding';\nconst AGENT_TAB_FAVICON_MARKER_ATTR = 'data-bb-agent-favicon';\n\nconst applyAgentTabFavicon = (faviconUrl: string): void => {\n if (faviconUrl.length === 0) {\n return;\n }\n const links = Array.from(\n document.querySelectorAll('link[rel~=\"icon\"]')\n ).filter((node): node is HTMLLinkElement => node instanceof HTMLLinkElement);\n if (links.length > 0) {\n for (const link of links) {\n link.href = faviconUrl;\n if (!link.type) {\n link.type = 'image/png';\n }\n }\n return;\n }\n\n const head = document.head ?? document.documentElement;\n if (!head) {\n return;\n }\n const link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/png';\n link.href = faviconUrl;\n link.setAttribute(AGENT_TAB_FAVICON_MARKER_ATTR, 'true');\n head.appendChild(link);\n};\n\nexport const runDriveAction = async (\n action: string,\n params: Record<string, unknown> | undefined\n): Promise<ContentResult> => {\n const buildError = (\n code: string,\n message: string,\n details?: Record<string, unknown>\n ): ContentResult => ({\n ok: false,\n error: {\n code,\n message,\n retryable: false,\n ...(details ? { details } : {}),\n },\n });\n\n const ok = (result?: unknown): ContentResult => ({ ok: true, result });\n\n const escapeSelector = (value: string): string => {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[\\\\\"']/g, '\\\\$&');\n };\n // Heuristic guard against unsafe regex patterns to avoid ReDoS in url_matches.\n const buildUrlMatcher = (\n pattern: string\n ):\n | { ok: true; matcher: (url: string) => boolean }\n | { ok: false; error: ContentResult } => {\n const maxLength = 256;\n if (pattern.length > maxLength) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n `url_matches pattern exceeds ${maxLength} characters.`\n ),\n };\n }\n const nestedQuantifiers =\n /\\((?:[^()\\\\]|\\\\.)*[+*{](?:[^()\\\\]|\\\\.)*\\)[+*{]/.test(pattern);\n const repeatedWildcards = /(\\.\\*.*\\.\\*)|(\\.\\+.*\\.\\+)/.test(pattern);\n if (nestedQuantifiers || repeatedWildcards) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n 'url_matches pattern rejected due to unsafe regex complexity.'\n ),\n };\n }\n try {\n const regex = new RegExp(pattern);\n return { ok: true, matcher: (url: string) => regex.test(url) };\n } catch {\n return { ok: true, matcher: (url: string) => url.includes(pattern) };\n }\n };\n\n const getRoleCandidates = (roleName: string): Element[] => {\n const selectorMap: Record<string, string> = {\n button:\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"],summary',\n link: 'a[href],[role=\"link\"]',\n checkbox: 'input[type=\"checkbox\"],[role=\"checkbox\"]',\n radio: 'input[type=\"radio\"],[role=\"radio\"]',\n textbox:\n 'textarea,input:not([type]),input[type=\"text\"],input[type=\"search\"],input[type=\"email\"],input[type=\"url\"],input[type=\"tel\"],input[type=\"password\"],[role=\"textbox\"]',\n combobox: 'select,input[list],[role=\"combobox\"]',\n };\n const selector =\n selectorMap[roleName] ?? `[role=\"${escapeSelector(roleName)}\"]`;\n return Array.from(document.querySelectorAll(selector)).filter(isVisible);\n };\n\n const findByRole = (locator: Record<string, unknown>): Element | null => {\n const role = locator.role;\n if (!role || typeof role !== 'object') {\n return null;\n }\n const roleName = (role as Record<string, unknown>).name;\n const roleValue = (role as Record<string, unknown>).value;\n if (typeof roleName !== 'string' || roleName.length === 0) {\n return null;\n }\n const candidates = getRoleCandidates(roleName);\n if (typeof roleValue !== 'string' || roleValue.length === 0) {\n return candidates[0] ?? null;\n }\n\n const query = normalizeText(roleValue);\n const matching = candidates.filter((candidate) =>\n getRoleAccessibleName(candidate).includes(query)\n );\n if (matching.length === 0) {\n return null;\n }\n const exactMatches = matching.filter(\n (candidate) => getRoleAccessibleName(candidate) === query\n );\n return scoreCandidates(exactMatches.length > 0 ? exactMatches : matching, {\n exactText: query,\n });\n };\n\n const resolveLocator = (\n locator: Record<string, unknown> | undefined\n ): Element | null => {\n if (!locator) {\n return null;\n }\n const ref = locator.ref;\n if (typeof ref === 'string' && ref.length > 0) {\n const normalized = ref.startsWith('@') ? ref : `@${ref}`;\n const selector = `[data-bv-ref=\"${escapeSelector(normalized)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n const fallback = recoverElementBySnapshotRef(normalized, {\n findByRole,\n });\n if (fallback) {\n return fallback;\n }\n }\n const testid = locator.testid;\n if (typeof testid === 'string' && testid.length > 0) {\n const selector = `[data-testid=\"${escapeSelector(testid)}\"]`;\n const found = scoreCandidates(\n Array.from(document.querySelectorAll(selector))\n );\n if (found) {\n return found;\n }\n }\n const css = locator.css;\n if (typeof css === 'string' && css.length > 0) {\n const found = scoreCandidates(Array.from(document.querySelectorAll(css)));\n if (found) {\n return found;\n }\n }\n const byRole = findByRole(locator);\n if (byRole) {\n return byRole;\n }\n const text = locator.text;\n if (typeof text === 'string' && text.length > 0) {\n return findByText(text);\n }\n return null;\n };\n\n const coerceBoolean = (value: string | boolean): boolean => {\n if (typeof value === 'boolean') {\n return value;\n }\n const normalized = value.trim().toLowerCase();\n return ['true', '1', 'yes', 'y', 'on', 'checked'].includes(normalized);\n };\n\n const dispatchValueEvents = (element: HTMLElement): void => {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n };\n\n const selectOption = (select: HTMLSelectElement, value: string): boolean => {\n const option = Array.from(select.options).find(\n (entry) => entry.value === value || entry.text === value\n );\n if (!option) {\n return false;\n }\n select.value = option.value;\n dispatchValueEvents(select);\n return true;\n };\n\n const selectOptionByIndex = (\n select: HTMLSelectElement,\n index: number\n ): boolean => {\n if (!Number.isInteger(index)) {\n return false;\n }\n if (index < 0 || index >= select.options.length) {\n return false;\n }\n select.selectedIndex = index;\n dispatchValueEvents(select);\n return true;\n };\n\n const setTextValue = (\n element: HTMLElement,\n value: string,\n clear: boolean\n ): boolean => {\n const tag = element.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = element as HTMLInputElement | HTMLTextAreaElement;\n if (clear) {\n input.value = '';\n }\n input.value = `${input.value}${value}`;\n dispatchValueEvents(input);\n return true;\n }\n if (element.isContentEditable) {\n if (clear) {\n element.textContent = '';\n }\n element.textContent = `${element.textContent ?? ''}${value}`;\n dispatchValueEvents(element);\n return true;\n }\n return false;\n };\n\n const detectFieldType = (\n element: Element\n ): 'text' | 'select' | 'checkbox' | 'radio' | 'contentEditable' => {\n if (element instanceof HTMLSelectElement) {\n return 'select';\n }\n if (element instanceof HTMLInputElement) {\n const type = element.type.toLowerCase();\n if (type === 'checkbox') {\n return 'checkbox';\n }\n if (type === 'radio') {\n return 'radio';\n }\n return 'text';\n }\n if (element instanceof HTMLTextAreaElement) {\n return 'text';\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n return 'contentEditable';\n }\n return 'text';\n };\n\n const submitIfRequested = (element: Element): void => {\n const form = element.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else if (element instanceof HTMLElement) {\n element.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })\n );\n }\n };\n\n const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => window.setTimeout(resolve, ms));\n\n const dispatchPointer = (\n element: Element,\n type: string,\n x: number,\n y: number\n ): void => {\n element.dispatchEvent(\n new PointerEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n button: 0,\n })\n );\n };\n\n const dispatchDrag = (\n element: Element,\n type: string,\n x: number,\n y: number,\n dataTransfer?: DataTransfer\n ): void => {\n try {\n element.dispatchEvent(\n new DragEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n dataTransfer,\n })\n );\n } catch {\n element.dispatchEvent(\n new Event(type, { bubbles: true, cancelable: true })\n );\n }\n };\n\n const keyToCode = (key: string): string => {\n const map: Record<string, string> = {\n Enter: 'Enter',\n Tab: 'Tab',\n Escape: 'Escape',\n Esc: 'Escape',\n Backspace: 'Backspace',\n Delete: 'Delete',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n ' ': 'Space',\n Space: 'Space',\n };\n if (map[key]) {\n return map[key];\n }\n if (key.length === 1) {\n if (/[a-zA-Z]/.test(key)) {\n return `Key${key.toUpperCase()}`;\n }\n if (/[0-9]/.test(key)) {\n return `Digit${key}`;\n }\n }\n return key;\n };\n\n const normalizeModifiers = (\n modifiers: unknown\n ): { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean } => {\n const state = { ctrl: false, alt: false, shift: false, meta: false };\n if (Array.isArray(modifiers)) {\n modifiers.forEach((modifier) => {\n if (typeof modifier !== 'string') {\n return;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'ctrl') {\n state.ctrl = true;\n } else if (normalized === 'alt') {\n state.alt = true;\n } else if (normalized === 'shift') {\n state.shift = true;\n } else if (normalized === 'meta') {\n state.meta = true;\n }\n });\n return state;\n }\n if (modifiers && typeof modifiers === 'object') {\n const record = modifiers as Record<string, unknown>;\n state.ctrl = Boolean(record.ctrl);\n state.alt = Boolean(record.alt);\n state.shift = Boolean(record.shift);\n state.meta = Boolean(record.meta);\n }\n return state;\n };\n\n const activeEditableElement = (): HTMLElement | null => {\n const active = document.activeElement;\n if (!active || !(active instanceof HTMLElement)) {\n return null;\n }\n const tag = active.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || active.isContentEditable) {\n return active;\n }\n return null;\n };\n\n const parseParams = (): Record<string, unknown> => params ?? {};\n\n try {\n switch (action) {\n case AGENT_TAB_BRANDING_ACTION: {\n const { favicon_url: faviconUrl } = parseParams();\n if (typeof faviconUrl !== 'string' || faviconUrl.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'favicon_url must be a non-empty string.'\n );\n }\n applyAgentTabFavicon(faviconUrl);\n return ok();\n }\n case 'drive.navigate': {\n const { url } = parseParams();\n if (typeof url !== 'string' || url.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'url must be a non-empty string.'\n );\n }\n window.location.href = url;\n return ok();\n }\n case 'drive.locator_point': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const targetState = readPopupTriggerState(target);\n const point = getHittablePoint(target, {\n preferDirectHit: targetState !== null,\n });\n return ok({\n x: point.x,\n y: point.y,\n ...(targetState ? { target_state: targetState } : {}),\n });\n }\n case 'drive.focus_locator': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n return ok();\n }\n case 'drive.snapshot_html': {\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.type_target_point': {\n const { locator } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n target = activeEditableElement();\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const tag = target.tagName.toLowerCase();\n if (\n tag !== 'input' &&\n tag !== 'textarea' &&\n !target.isContentEditable\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.clear_active_editable': {\n const target = activeEditableElement();\n if (!target) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No active editable target to clear.'\n );\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n input.value = '';\n dispatchValueEvents(input);\n return ok({ ok: true });\n }\n if (target.isContentEditable) {\n target.textContent = '';\n dispatchValueEvents(target);\n return ok({ ok: true });\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'Active target is not editable (input, textarea, or contenteditable).'\n );\n }\n case 'drive.click': {\n const { locator, click_count } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const count =\n typeof click_count === 'number' && Number.isFinite(click_count)\n ? Math.max(1, Math.floor(click_count))\n : 1;\n const strategy = selectClickStrategy(target);\n if (strategy.kind === 'popup_trigger') {\n return await executePopupTriggerClick({\n target,\n beforeState: strategy.state,\n clickCount: count,\n locationBefore: window.location.href,\n sleep,\n });\n }\n return executeGenericClick({\n target,\n clickCount: count,\n });\n }\n case 'drive.hover': {\n const { locator, delay_ms } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const eventInit = {\n bubbles: true,\n cancelable: true,\n clientX: centerX,\n clientY: centerY,\n };\n target.dispatchEvent(new MouseEvent('mouseover', eventInit));\n target.dispatchEvent(\n new MouseEvent('mouseenter', { ...eventInit, bubbles: false })\n );\n target.dispatchEvent(new MouseEvent('mousemove', eventInit));\n if (typeof delay_ms === 'number' && Number.isFinite(delay_ms)) {\n const waitMs = Math.min(Math.max(delay_ms, 0), 10000);\n if (waitMs > 0) {\n await sleep(waitMs);\n }\n }\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.select': {\n const { locator, value, text, index } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n if (!(target instanceof HTMLSelectElement)) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not a select element.'\n );\n }\n let applied = false;\n if (typeof index === 'number' && Number.isFinite(index)) {\n applied = selectOptionByIndex(target, Math.trunc(index));\n }\n if (!applied && typeof value === 'string') {\n applied = selectOption(target, value);\n }\n if (!applied && typeof text === 'string') {\n applied = selectOption(target, text);\n }\n if (!applied) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No matching option found for select.'\n );\n }\n return ok();\n }\n case 'drive.type': {\n const { locator, text, clear, submit } = parseParams();\n if (typeof text !== 'string') {\n return buildError('INVALID_ARGUMENT', 'text must be a string.');\n }\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n const active = activeEditableElement();\n if (active) {\n target = active;\n }\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n target.focus();\n const tag = target.tagName.toLowerCase();\n const shouldClear = Boolean(clear);\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n if (shouldClear) {\n input.value = '';\n }\n input.value = `${input.value}${text}`;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (target.isContentEditable) {\n if (shouldClear) {\n target.textContent = '';\n }\n target.textContent = `${target.textContent ?? ''}${text}`;\n target.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n\n if (submit) {\n const form = target.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else {\n target.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Enter',\n bubbles: true,\n })\n );\n }\n }\n\n return ok();\n }\n case 'drive.detect_field_type': {\n const { locator, selector } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target && typeof selector === 'string' && selector.length > 0) {\n target = document.querySelector(selector);\n }\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n return ok({ fieldType: detectFieldType(target) });\n }\n case 'drive.fill_form': {\n const { fields } = parseParams();\n if (!Array.isArray(fields) || fields.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'fields must be a non-empty array.'\n );\n }\n let filled = 0;\n const errors: string[] = [];\n fields.forEach((field, index) => {\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n return;\n }\n const record = field as Record<string, unknown>;\n const selector = record.selector;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : undefined;\n let element: Element | null = null;\n if (locator) {\n element = resolveLocator(locator);\n }\n if (!element && typeof selector === 'string' && selector.length > 0) {\n element = document.querySelector(selector);\n }\n if (!element) {\n errors.push(`Field ${index} could not be resolved.`);\n return;\n }\n\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n return;\n }\n\n const type =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n const resolvedType =\n type === 'auto' ? detectFieldType(element) : type;\n const submit = Boolean(record.submit);\n\n let applied = false;\n if (resolvedType === 'select') {\n if (element instanceof HTMLSelectElement) {\n applied = selectOption(element, String(value));\n }\n } else if (resolvedType === 'checkbox' || resolvedType === 'radio') {\n if (element instanceof HTMLInputElement) {\n const shouldCheck =\n typeof value === 'boolean' ? value : coerceBoolean(value);\n element.checked = shouldCheck;\n dispatchValueEvents(element);\n applied = true;\n }\n } else {\n if (element instanceof HTMLElement) {\n applied = setTextValue(element, String(value), true);\n }\n }\n\n if (!applied) {\n errors.push(`Field ${index} could not be filled.`);\n return;\n }\n\n if (submit) {\n submitIfRequested(element);\n }\n filled += 1;\n });\n\n return ok({\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n });\n }\n case 'drive.drag': {\n const { from, to, steps } = parseParams();\n const fromEl = resolveLocator(from as Record<string, unknown>);\n if (!fromEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag source.'\n );\n }\n const toEl = resolveLocator(to as Record<string, unknown>);\n if (!toEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag target.'\n );\n }\n\n const fromRect = fromEl.getBoundingClientRect();\n const toRect = toEl.getBoundingClientRect();\n const startX = fromRect.left + fromRect.width / 2;\n const startY = fromRect.top + fromRect.height / 2;\n const endX = toRect.left + toRect.width / 2;\n const endY = toRect.top + toRect.height / 2;\n // Defensive bounds in case content script receives unvalidated inputs.\n const totalSteps =\n typeof steps === 'number' && Number.isFinite(steps)\n ? Math.max(1, Math.min(50, Math.floor(steps)))\n : 12;\n let dataTransfer: DataTransfer | undefined;\n try {\n dataTransfer = new DataTransfer();\n } catch {\n dataTransfer = undefined;\n }\n\n dispatchPointer(fromEl, 'pointerdown', startX, startY);\n dispatchDrag(fromEl, 'dragstart', startX, startY, dataTransfer);\n\n for (let i = 1; i <= totalSteps; i += 1) {\n const progress = i / totalSteps;\n const x = startX + (endX - startX) * progress;\n const y = startY + (endY - startY) * progress;\n const target = document.elementFromPoint(x, y) ?? toEl;\n dispatchPointer(target, 'pointermove', x, y);\n dispatchDrag(target, 'dragover', x, y, dataTransfer);\n await sleep(10);\n }\n\n const dropTarget = document.elementFromPoint(endX, endY) ?? toEl;\n dispatchDrag(dropTarget, 'drop', endX, endY, dataTransfer);\n dispatchPointer(dropTarget, 'pointerup', endX, endY);\n dispatchDrag(fromEl, 'dragend', endX, endY, dataTransfer);\n return ok();\n }\n case 'drive.key_press': {\n const { key, modifiers } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n return ok();\n }\n case 'drive.key': {\n const { key, modifiers, repeat } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n const count =\n typeof repeat === 'number' && Number.isFinite(repeat)\n ? Math.max(1, Math.min(50, Math.floor(repeat)))\n : 1;\n for (let i = 0; i < count; i += 1) {\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n }\n return ok();\n }\n case 'drive.scroll': {\n const { delta_x, delta_y, top, left, behavior } = parseParams();\n const scrollBehavior =\n behavior === 'smooth' || behavior === 'auto' ? behavior : undefined;\n if (typeof top === 'number' || typeof left === 'number') {\n window.scrollTo({\n top: typeof top === 'number' ? top : undefined,\n left: typeof left === 'number' ? left : undefined,\n behavior: scrollBehavior,\n });\n return ok();\n }\n if (typeof delta_x === 'number' || typeof delta_y === 'number') {\n window.scrollBy({\n left: typeof delta_x === 'number' ? delta_x : 0,\n top: typeof delta_y === 'number' ? delta_y : 0,\n behavior: scrollBehavior,\n });\n return ok();\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'scroll requires delta_x/delta_y or top/left.'\n );\n }\n case 'drive.screenshot_meta': {\n const root = document.documentElement;\n const body = document.body;\n const scrollWidth = Math.max(\n root?.scrollWidth ?? 0,\n root?.clientWidth ?? 0,\n body?.scrollWidth ?? 0,\n body?.clientWidth ?? 0\n );\n const scrollHeight = Math.max(\n root?.scrollHeight ?? 0,\n root?.clientHeight ?? 0,\n body?.scrollHeight ?? 0,\n body?.clientHeight ?? 0\n );\n\n return ok({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollWidth,\n scrollHeight,\n devicePixelRatio:\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1,\n });\n }\n case 'drive.screenshot_element': {\n const { selector } = parseParams();\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a non-empty string.'\n );\n }\n\n let element: Element | null = null;\n try {\n element = document.querySelector(selector);\n } catch {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a valid CSS selector.'\n );\n }\n\n if (!element) {\n return buildError('INVALID_ARGUMENT', 'No element matched selector.');\n }\n\n try {\n (element as HTMLElement).scrollIntoView?.({\n block: 'center',\n inline: 'center',\n });\n } catch {\n // Ignore scroll failures; capture whatever is visible.\n }\n\n const rect = element.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n const dpr =\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1;\n\n return ok({\n selector,\n pageX: rect.left + scrollX,\n pageY: rect.top + scrollY,\n width: rect.width,\n height: rect.height,\n viewportLeft: rect.left,\n viewportTop: rect.top,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollX,\n scrollY,\n devicePixelRatio: dpr,\n });\n }\n case 'drive.wait_for': {\n const { condition, timeout_ms } = parseParams();\n if (!condition || typeof condition !== 'object') {\n return buildError('INVALID_ARGUMENT', 'condition must be an object.');\n }\n const kind = (condition as Record<string, unknown>).kind;\n const value = (condition as Record<string, unknown>).value;\n if (\n typeof kind !== 'string' ||\n !['locator_visible', 'text_present', 'url_matches'].includes(kind)\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.kind must be locator_visible, text_present, or url_matches.'\n );\n }\n if (typeof value !== 'string' || value.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.value must be a non-empty string.'\n );\n }\n const timeout =\n typeof timeout_ms === 'number' && Number.isFinite(timeout_ms)\n ? Math.max(0, timeout_ms)\n : 30000;\n const start = Date.now();\n const urlMatcher =\n kind === 'url_matches' ? buildUrlMatcher(value) : null;\n if (urlMatcher && !urlMatcher.ok) {\n return urlMatcher.error;\n }\n\n const checkCondition = (): boolean => {\n if (kind === 'text_present') {\n return getRenderedText(document.body).includes(\n normalizeText(value)\n );\n }\n if (kind === 'url_matches') {\n return urlMatcher\n ? urlMatcher.matcher(window.location.href)\n : window.location.href.includes(value);\n }\n const selector = value;\n const element = document.querySelector(selector);\n return Boolean(element && isVisible(element));\n };\n\n return await new Promise<ContentResult>((resolve) => {\n const tick = () => {\n if (checkCondition()) {\n resolve(ok());\n return;\n }\n if (Date.now() - start >= timeout) {\n resolve(\n buildError('TIMEOUT', `wait_for timed out after ${timeout}ms.`)\n );\n return;\n }\n window.setTimeout(tick, 100);\n };\n tick();\n });\n }\n case 'drive.go_back': {\n // Trigger history changes on the next tick so the background script gets\n // our response before this page unloads.\n window.setTimeout(() => {\n history.back();\n }, 0);\n return ok();\n }\n case 'drive.go_forward': {\n window.setTimeout(() => {\n history.forward();\n }, 0);\n return ok();\n }\n default:\n return buildError('INVALID_ARGUMENT', `Unsupported action ${action}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return buildError('EVALUATION_FAILED', message);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nif (typeof chrome !== 'undefined' && chrome.runtime?.onMessage) {\n chrome.runtime.onMessage.addListener(\n (\n message: Record<string, unknown>,\n _sender: unknown,\n sendResponse: (response: ContentResult) => void\n ) => {\n if (!isRecord(message) || typeof message.action !== 'string') {\n sendResponse({\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Invalid content script request.',\n retryable: false,\n },\n });\n return;\n }\n\n void runDriveAction(\n message.action,\n message.params as Record<string, unknown>\n )\n .then(sendResponse)\n .catch((error) => {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n sendResponse({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n },\n });\n });\n\n return true;\n }\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export type PopupTriggerState = {\n kind: 'popup_trigger';\n ariaHasPopup?: string;\n ariaExpanded?: string;\n dataState?: string;\n open?: boolean;\n};\n\nconst normalizeAttr = (value: string | null): string | undefined => {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n};\n\nexport const readPopupTriggerState = (\n target: Element\n): PopupTriggerState | null => {\n if (!(target instanceof HTMLElement)) {\n return null;\n }\n const ariaHasPopup = normalizeAttr(target.getAttribute('aria-haspopup'));\n const ariaExpanded = normalizeAttr(target.getAttribute('aria-expanded'));\n const dataState = normalizeAttr(target.getAttribute('data-state'));\n const open =\n 'open' in target && typeof (target as { open?: unknown }).open === 'boolean'\n ? ((target as { open: boolean }).open ?? false)\n : undefined;\n const qualifiesAsPopupTrigger =\n Boolean(ariaHasPopup) || ariaExpanded !== undefined || open !== undefined;\n if (!qualifiesAsPopupTrigger && dataState === undefined) {\n return null;\n }\n if (!qualifiesAsPopupTrigger) {\n return null;\n }\n return {\n kind: 'popup_trigger',\n ariaHasPopup,\n ariaExpanded,\n dataState,\n open,\n };\n};\n\nexport const popupTriggerStateChanged = (\n before: PopupTriggerState | null,\n after: PopupTriggerState | null\n): boolean => {\n if (!before || !after) {\n return before !== after;\n }\n return (\n before.ariaExpanded !== after.ariaExpanded ||\n before.dataState !== after.dataState ||\n before.open !== after.open\n );\n};\n\nexport const coercePopupTriggerState = (\n value: unknown\n): PopupTriggerState | undefined => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n if (record.kind !== 'popup_trigger') {\n return undefined;\n }\n const ariaHasPopup =\n typeof record.ariaHasPopup === 'string' ? record.ariaHasPopup : undefined;\n const ariaExpanded =\n typeof record.ariaExpanded === 'string' ? record.ariaExpanded : undefined;\n const dataState =\n typeof record.dataState === 'string' ? record.dataState : undefined;\n const open = typeof record.open === 'boolean' ? record.open : undefined;\n return {\n kind: 'popup_trigger',\n ...(ariaHasPopup ? { ariaHasPopup } : {}),\n ...(ariaExpanded !== undefined ? { ariaExpanded } : {}),\n ...(dataState !== undefined ? { dataState } : {}),\n ...(open !== undefined ? { open } : {}),\n };\n};\n", "import {\n readPopupTriggerState,\n type PopupTriggerState,\n} from '../popup-trigger-state.js';\n\nexport type ClickStrategySelection =\n | { kind: 'generic' }\n | { kind: 'popup_trigger'; state: PopupTriggerState };\n\nexport const selectClickStrategy = (\n target: Element\n): ClickStrategySelection => {\n const popupTriggerState = readPopupTriggerState(target);\n if (popupTriggerState) {\n return {\n kind: 'popup_trigger',\n state: popupTriggerState,\n };\n }\n return { kind: 'generic' };\n};\n", "type DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nexport const executeGenericClick = (options: {\n target: Element;\n clickCount: number;\n}): ContentResult => {\n const { target, clickCount } = options;\n // Clicking elements that trigger JS dialogs (alert/confirm/prompt) can block\n // the renderer thread before we can reply to the background script, so defer\n // the actual click to the next tick and acknowledge immediately.\n window.setTimeout(() => {\n try {\n if (target instanceof HTMLElement) {\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n }\n for (let i = 0; i < clickCount; i += 1) {\n (target as HTMLElement).click();\n }\n } catch {\n // Best-effort: the element may have disappeared or navigation occurred.\n }\n }, 0);\n return { ok: true };\n};\n", "import {\n popupTriggerStateChanged,\n readPopupTriggerState,\n type PopupTriggerState,\n} from '../popup-trigger-state.js';\n\ntype DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nexport const executePopupTriggerClick = async (options: {\n target: Element;\n beforeState: PopupTriggerState;\n clickCount: number;\n locationBefore: string;\n sleep: (ms: number) => Promise<void>;\n settleMs?: number;\n}): Promise<ContentResult> => {\n const popupTarget = options.target as HTMLElement;\n try {\n popupTarget.focus({ preventScroll: true });\n } catch {\n popupTarget.focus();\n }\n for (let i = 0; i < options.clickCount; i += 1) {\n popupTarget.click();\n }\n await options.sleep(options.settleMs ?? 50);\n if (\n window.location.href !== options.locationBefore ||\n !options.target.isConnected\n ) {\n return { ok: true };\n }\n const popupTriggerAfter = readPopupTriggerState(options.target);\n if (\n !popupTriggerStateChanged(options.beforeState, popupTriggerAfter ?? null)\n ) {\n return {\n ok: false,\n error: {\n code: 'FAILED_PRECONDITION',\n message:\n 'Click focused the popup trigger but did not change its open state.',\n retryable: false,\n details: {\n reason: 'click_state_unchanged',\n control: options.beforeState.kind,\n aria_haspopup: options.beforeState.ariaHasPopup,\n aria_expanded_before: options.beforeState.ariaExpanded,\n aria_expanded_after: popupTriggerAfter?.ariaExpanded,\n data_state_before: options.beforeState.dataState,\n data_state_after: popupTriggerAfter?.dataState,\n },\n },\n };\n }\n return { ok: true };\n};\n", "export const pointHitsTarget = (\n target: Element,\n x: number,\n y: number,\n options?: { directOnly?: boolean }\n): boolean => {\n if (typeof document.elementFromPoint !== 'function') {\n return true;\n }\n const hit = document.elementFromPoint(x, y);\n if (!hit) {\n return false;\n }\n if (options?.directOnly) {\n return target === hit;\n }\n return target === hit || target.contains(hit);\n};\n\nexport const getHittablePoint = (\n target: Element,\n options?: { preferDirectHit?: boolean }\n): { x: number; y: number } => {\n const rect = target.getBoundingClientRect();\n const insetX = Math.min(Math.max(rect.width * 0.25, 1), rect.width / 2);\n const insetY = Math.min(Math.max(rect.height * 0.25, 1), rect.height / 2);\n const candidatePoints = [\n { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 },\n { x: rect.left + insetX, y: rect.top + insetY },\n { x: rect.right - insetX, y: rect.top + insetY },\n { x: rect.left + insetX, y: rect.bottom - insetY },\n { x: rect.right - insetX, y: rect.bottom - insetY },\n { x: rect.left + rect.width / 2, y: rect.top + insetY },\n { x: rect.left + rect.width / 2, y: rect.bottom - insetY },\n { x: rect.left + insetX, y: rect.top + rect.height / 2 },\n { x: rect.right - insetX, y: rect.top + rect.height / 2 },\n ];\n if (options?.preferDirectHit) {\n for (const point of candidatePoints) {\n if (pointHitsTarget(target, point.x, point.y, { directOnly: true })) {\n return point;\n }\n }\n }\n for (const point of candidatePoints) {\n if (pointHitsTarget(target, point.x, point.y)) {\n return point;\n }\n }\n return candidatePoints[0] ?? { x: rect.left, y: rect.top };\n};\n", "import { getHittablePoint, pointHitsTarget } from './locator-point.js';\n\nconst collectVisibleText = (\n node: Node,\n isVisible: (element: Element) => boolean\n): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || '';\n }\n if (!(node instanceof Element)) {\n return '';\n }\n if (!isVisible(node)) {\n return '';\n }\n if (node instanceof HTMLElement) {\n const { innerText } = node;\n if (typeof innerText === 'string' && innerText.length > 0) {\n return innerText;\n }\n }\n return Array.from(node.childNodes)\n .map((child) => collectVisibleText(child, isVisible))\n .join('');\n};\n\nexport const normalizeText = (value: string): string =>\n value.replace(/\\s+/g, ' ').trim();\n\nexport const isClickable = (element: Element): boolean =>\n element instanceof HTMLElement &&\n element.matches(\n 'a,button,input,textarea,select,summary,label,[role=\"button\"],[tabindex]'\n );\n\nexport const getNodeDepth = (element: Element): number => {\n let depth = 0;\n let current: Element | null = element;\n while (current) {\n depth += 1;\n current = current.parentElement;\n }\n return depth;\n};\n\nexport const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n const style = window.getComputedStyle(element);\n if (style.visibility === 'hidden' || style.display === 'none') {\n return false;\n }\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 && rect.height === 0) {\n return false;\n }\n if (\n element.offsetWidth === 0 &&\n element.offsetHeight === 0 &&\n element.getClientRects().length === 0\n ) {\n return false;\n }\n let current: HTMLElement | null = element;\n while (current) {\n const currentStyle = window.getComputedStyle(current);\n if (currentStyle.display === 'none') {\n return false;\n }\n if (\n currentStyle.visibility === 'hidden' ||\n currentStyle.visibility === 'collapse'\n ) {\n return false;\n }\n const opacity = Number.parseFloat(currentStyle.opacity ?? '1');\n if (Number.isFinite(opacity) && opacity <= 0) {\n return false;\n }\n current = current.parentElement;\n }\n return true;\n};\n\nexport const isOnScreen = (element: Element): boolean => {\n if (!(element instanceof HTMLElement) || !isVisible(element)) {\n return false;\n }\n const rect = element.getBoundingClientRect();\n return (\n rect.right > 0 &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.top < window.innerHeight\n );\n};\n\nexport const getRenderedText = (element: Element): string =>\n normalizeText(collectVisibleText(element, isVisible));\n\nexport const getRoleAccessibleName = (element: Element): string =>\n normalizeText(\n element.getAttribute('aria-label') ??\n element.getAttribute('title') ??\n getRenderedText(element)\n );\n\nconst getActionabilityScore = (\n element: Element\n): { directHit: boolean; hittable: boolean } => {\n if (!(element instanceof HTMLElement) || !isVisible(element)) {\n return { directHit: false, hittable: false };\n }\n const point = getHittablePoint(element, { preferDirectHit: true });\n return {\n directHit: pointHitsTarget(element, point.x, point.y, { directOnly: true }),\n hittable: pointHitsTarget(element, point.x, point.y),\n };\n};\n\nexport const scoreCandidates = (\n candidates: Element[],\n options?: {\n exactText?: string;\n exactHref?: string;\n }\n): Element | null => {\n const queryText = options?.exactText ? normalizeText(options.exactText) : '';\n const queryHref = options?.exactHref ?? '';\n if (candidates.length === 0) {\n return null;\n }\n const scored = candidates\n .filter(isVisible)\n .map((candidate) => {\n const text = getRenderedText(candidate);\n const accessibleName = getRoleAccessibleName(candidate);\n const href = candidate.getAttribute('href') ?? '';\n const actionability = getActionabilityScore(candidate);\n return {\n candidate,\n exactText:\n queryText.length > 0 &&\n (text === queryText || accessibleName === queryText),\n exactHref:\n queryHref.length > 0 &&\n (href === queryHref ||\n (candidate instanceof HTMLAnchorElement &&\n candidate.href === queryHref)),\n directHit: actionability.directHit,\n hittable: actionability.hittable,\n onScreen: isOnScreen(candidate),\n clickable: isClickable(candidate),\n textLength: text.length,\n depth: getNodeDepth(candidate),\n };\n })\n .sort((a, b) => {\n if (a.exactHref !== b.exactHref) {\n return a.exactHref ? -1 : 1;\n }\n if (a.exactText !== b.exactText) {\n return a.exactText ? -1 : 1;\n }\n if (a.directHit !== b.directHit) {\n return a.directHit ? -1 : 1;\n }\n if (a.hittable !== b.hittable) {\n return a.hittable ? -1 : 1;\n }\n if (a.onScreen !== b.onScreen) {\n return a.onScreen ? -1 : 1;\n }\n if (a.clickable !== b.clickable) {\n return a.clickable ? -1 : 1;\n }\n if (a.textLength !== b.textLength) {\n return a.textLength - b.textLength;\n }\n return b.depth - a.depth;\n });\n return scored[0]?.candidate ?? candidates[0] ?? null;\n};\n\nexport const findByText = (text: string): Element | null => {\n const query = normalizeText(text);\n if (query.length === 0) {\n return null;\n }\n\n const candidateMap = new Map<\n Element,\n {\n exact: boolean;\n directHit: boolean;\n hittable: boolean;\n onScreen: boolean;\n clickable: boolean;\n textLength: number;\n depth: number;\n }\n >();\n const tree = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_ELEMENT\n );\n let node = tree.nextNode();\n while (node) {\n const element = node as Element;\n if (!isVisible(element)) {\n node = tree.nextNode();\n continue;\n }\n const elementText = getRenderedText(element);\n if (!elementText.includes(query)) {\n node = tree.nextNode();\n continue;\n }\n\n let preferredTarget: Element = element;\n let current: Element | null = element;\n while (current) {\n if (\n current !== element &&\n isVisible(current) &&\n isClickable(current) &&\n getRenderedText(current).includes(query)\n ) {\n preferredTarget = current;\n break;\n }\n current = current.parentElement;\n }\n\n const preferredText = getRenderedText(preferredTarget);\n const currentBest = candidateMap.get(preferredTarget);\n const actionability = getActionabilityScore(preferredTarget);\n const nextScore = {\n exact: preferredText === query || elementText === query,\n directHit: actionability.directHit,\n hittable: actionability.hittable,\n onScreen: isOnScreen(preferredTarget),\n clickable: isClickable(preferredTarget),\n textLength: preferredText.length || elementText.length,\n depth: getNodeDepth(preferredTarget),\n };\n\n if (\n !currentBest ||\n Number(nextScore.exact) > Number(currentBest.exact) ||\n (nextScore.exact === currentBest.exact &&\n Number(nextScore.directHit) > Number(currentBest.directHit)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.directHit === currentBest.directHit &&\n Number(nextScore.hittable) > Number(currentBest.hittable)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.directHit === currentBest.directHit &&\n nextScore.hittable === currentBest.hittable &&\n Number(nextScore.onScreen) > Number(currentBest.onScreen)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.directHit === currentBest.directHit &&\n nextScore.hittable === currentBest.hittable &&\n nextScore.onScreen === currentBest.onScreen &&\n Number(nextScore.clickable) > Number(currentBest.clickable)) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.directHit === currentBest.directHit &&\n nextScore.hittable === currentBest.hittable &&\n nextScore.onScreen === currentBest.onScreen &&\n nextScore.clickable === currentBest.clickable &&\n nextScore.textLength < currentBest.textLength) ||\n (nextScore.exact === currentBest.exact &&\n nextScore.directHit === currentBest.directHit &&\n nextScore.hittable === currentBest.hittable &&\n nextScore.onScreen === currentBest.onScreen &&\n nextScore.clickable === currentBest.clickable &&\n nextScore.textLength === currentBest.textLength &&\n nextScore.depth > currentBest.depth)\n ) {\n candidateMap.set(preferredTarget, nextScore);\n }\n\n node = tree.nextNode();\n }\n\n const candidates = Array.from(candidateMap.entries()).sort((a, b) => {\n const [, left] = a;\n const [, right] = b;\n if (left.exact !== right.exact) {\n return left.exact ? -1 : 1;\n }\n if (left.directHit !== right.directHit) {\n return left.directHit ? -1 : 1;\n }\n if (left.hittable !== right.hittable) {\n return left.hittable ? -1 : 1;\n }\n if (left.onScreen !== right.onScreen) {\n return left.onScreen ? -1 : 1;\n }\n if (left.clickable !== right.clickable) {\n return left.clickable ? -1 : 1;\n }\n if (left.textLength !== right.textLength) {\n return left.textLength - right.textLength;\n }\n return right.depth - left.depth;\n });\n return candidates[0]?.[0] ?? null;\n};\n", "import { findByText, scoreCandidates } from './locator-ranking.js';\n\nexport const SNAPSHOT_REF_REGISTRY_ID = '__bb_snapshot_ref_registry__';\n\nexport type SnapshotRefMetadata = {\n role?: string;\n name?: string;\n url?: string;\n};\n\nexport const readSnapshotRefRegistry = (): Map<string, SnapshotRefMetadata> => {\n const registry = new Map<string, SnapshotRefMetadata>();\n const el = document.getElementById(SNAPSHOT_REF_REGISTRY_ID);\n const raw = el?.textContent;\n if (!raw) {\n return registry;\n }\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return registry;\n }\n for (const entry of parsed) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n const ref = (entry as { ref?: unknown }).ref;\n if (typeof ref !== 'string' || ref.length === 0) {\n continue;\n }\n registry.set(ref, {\n role:\n typeof (entry as { role?: unknown }).role === 'string'\n ? ((entry as { role?: string }).role ?? undefined)\n : undefined,\n name:\n typeof (entry as { name?: unknown }).name === 'string'\n ? ((entry as { name?: string }).name ?? undefined)\n : undefined,\n url:\n typeof (entry as { url?: unknown }).url === 'string'\n ? ((entry as { url?: string }).url ?? undefined)\n : undefined,\n });\n }\n } catch {\n return new Map();\n }\n return registry;\n};\n\n// Recovery is deliberately best-effort. We only persist metadata for refs that\n// rebound into the live DOM during snapshot capture, then try to recover in the\n// same order the existing UI proved reliable on rerendered link lists: exact\n// url/text link match first, then role/name, then plain text.\nexport const recoverElementBySnapshotRef = (\n ref: string,\n options: {\n findByRole: (locator: Record<string, unknown>) => Element | null;\n }\n): Element | null => {\n const metadata = readSnapshotRefRegistry().get(ref);\n if (!metadata) {\n return null;\n }\n\n if (typeof metadata.url === 'string' && metadata.url.length > 0) {\n const linkCandidates = Array.from(\n document.querySelectorAll('a[href],[role=\"link\"]')\n );\n const bestLink = scoreCandidates(linkCandidates, {\n exactHref: metadata.url,\n exactText: metadata.name,\n });\n if (bestLink) {\n return bestLink;\n }\n }\n\n if (typeof metadata.role === 'string' && metadata.role.length > 0) {\n const roleMatch = options.findByRole({\n role: {\n name: metadata.role,\n ...(metadata.name ? { value: metadata.name } : {}),\n },\n });\n if (roleMatch) {\n return roleMatch;\n }\n }\n\n if (typeof metadata.name === 'string' && metadata.name.length > 0) {\n return findByText(metadata.name);\n }\n\n return null;\n};\n", "import { readPopupTriggerState } from './popup-trigger-state.js';\nimport { selectClickStrategy } from './click-strategies/index.js';\nimport { executeGenericClick } from './click-strategies/generic-click.js';\nimport { executePopupTriggerClick } from './click-strategies/popup-trigger-click.js';\nimport { getHittablePoint } from './locator-point.js';\nimport {\n findByText,\n getRenderedText,\n getRoleAccessibleName,\n isClickable,\n isVisible,\n normalizeText,\n scoreCandidates,\n} from './locator-ranking.js';\nimport { recoverElementBySnapshotRef } from './snapshot-ref-recovery.js';\n\ntype DriveErrorInfo = {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\ntype ContentResult =\n | { ok: true; result?: unknown }\n | { ok: false; error: DriveErrorInfo };\n\nconst AGENT_TAB_BRANDING_ACTION = 'drive.agent_tab_branding';\nconst AGENT_TAB_FAVICON_MARKER_ATTR = 'data-bb-agent-favicon';\nconst CONTENT_LISTENER_MARKER = '__browserBridgeContentListenerInstalled__';\n\nconst applyAgentTabFavicon = (faviconUrl: string): void => {\n if (faviconUrl.length === 0) {\n return;\n }\n const links = Array.from(\n document.querySelectorAll('link[rel~=\"icon\"]')\n ).filter((node): node is HTMLLinkElement => node instanceof HTMLLinkElement);\n if (links.length > 0) {\n for (const link of links) {\n link.href = faviconUrl;\n if (!link.type) {\n link.type = 'image/png';\n }\n }\n return;\n }\n\n const head = document.head ?? document.documentElement;\n if (!head) {\n return;\n }\n const link = document.createElement('link');\n link.rel = 'icon';\n link.type = 'image/png';\n link.href = faviconUrl;\n link.setAttribute(AGENT_TAB_FAVICON_MARKER_ATTR, 'true');\n head.appendChild(link);\n};\n\nexport const runDriveAction = async (\n action: string,\n params: Record<string, unknown> | undefined\n): Promise<ContentResult> => {\n const buildError = (\n code: string,\n message: string,\n details?: Record<string, unknown>\n ): ContentResult => ({\n ok: false,\n error: {\n code,\n message,\n retryable: false,\n ...(details ? { details } : {}),\n },\n });\n\n const ok = (result?: unknown): ContentResult => ({ ok: true, result });\n\n const escapeSelector = (value: string): string => {\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(value);\n }\n return value.replace(/[\\\\\"']/g, '\\\\$&');\n };\n // Heuristic guard against unsafe regex patterns to avoid ReDoS in url_matches.\n const buildUrlMatcher = (\n pattern: string\n ):\n | { ok: true; matcher: (url: string) => boolean }\n | { ok: false; error: ContentResult } => {\n const maxLength = 256;\n if (pattern.length > maxLength) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n `url_matches pattern exceeds ${maxLength} characters.`\n ),\n };\n }\n const nestedQuantifiers =\n /\\((?:[^()\\\\]|\\\\.)*[+*{](?:[^()\\\\]|\\\\.)*\\)[+*{]/.test(pattern);\n const repeatedWildcards = /(\\.\\*.*\\.\\*)|(\\.\\+.*\\.\\+)/.test(pattern);\n if (nestedQuantifiers || repeatedWildcards) {\n return {\n ok: false,\n error: buildError(\n 'INVALID_ARGUMENT',\n 'url_matches pattern rejected due to unsafe regex complexity.'\n ),\n };\n }\n try {\n const regex = new RegExp(pattern);\n return { ok: true, matcher: (url: string) => regex.test(url) };\n } catch {\n return { ok: true, matcher: (url: string) => url.includes(pattern) };\n }\n };\n\n const getRoleCandidates = (roleName: string): Element[] => {\n const selectorMap: Record<string, string> = {\n button:\n 'button,[role=\"button\"],input[type=\"button\"],input[type=\"submit\"],input[type=\"reset\"],summary',\n link: 'a[href],[role=\"link\"]',\n checkbox: 'input[type=\"checkbox\"],[role=\"checkbox\"]',\n radio: 'input[type=\"radio\"],[role=\"radio\"]',\n textbox:\n 'textarea,input:not([type]),input[type=\"text\"],input[type=\"search\"],input[type=\"email\"],input[type=\"url\"],input[type=\"tel\"],input[type=\"password\"],[role=\"textbox\"]',\n combobox: 'select,input[list],[role=\"combobox\"]',\n };\n const selector =\n selectorMap[roleName] ?? `[role=\"${escapeSelector(roleName)}\"]`;\n return Array.from(document.querySelectorAll(selector)).filter(isVisible);\n };\n\n const findByRole = (locator: Record<string, unknown>): Element | null => {\n const role = locator.role;\n if (!role || typeof role !== 'object') {\n return null;\n }\n const roleName = (role as Record<string, unknown>).name;\n const roleValue = (role as Record<string, unknown>).value;\n if (typeof roleName !== 'string' || roleName.length === 0) {\n return null;\n }\n const candidates = getRoleCandidates(roleName);\n if (typeof roleValue !== 'string' || roleValue.length === 0) {\n return candidates[0] ?? null;\n }\n\n const query = normalizeText(roleValue);\n const matching = candidates.filter((candidate) =>\n getRoleAccessibleName(candidate).includes(query)\n );\n if (matching.length > 0) {\n const exactMatches = matching.filter(\n (candidate) => getRoleAccessibleName(candidate) === query\n );\n return scoreCandidates(\n exactMatches.length > 0 ? exactMatches : matching,\n {\n exactText: query,\n }\n );\n }\n\n // Accessibility snapshots can expose actionable controls that do not line up\n // cleanly with our narrow role selector map during hydration or custom UI rendering.\n const fallbackCandidates = Array.from(\n document.querySelectorAll('*')\n ).filter((candidate) => {\n if (!isVisible(candidate)) {\n return false;\n }\n if (roleName === 'button' && !isClickable(candidate)) {\n return false;\n }\n return getRoleAccessibleName(candidate).includes(query);\n });\n if (fallbackCandidates.length === 0) {\n return null;\n }\n const exactFallbackMatches = fallbackCandidates.filter(\n (candidate) => getRoleAccessibleName(candidate) === query\n );\n return scoreCandidates(\n exactFallbackMatches.length > 0\n ? exactFallbackMatches\n : fallbackCandidates,\n {\n exactText: query,\n }\n );\n };\n\n const resolveLocator = (\n locator: Record<string, unknown> | undefined\n ): Element | null => {\n if (!locator) {\n return null;\n }\n const ref = locator.ref;\n if (typeof ref === 'string' && ref.length > 0) {\n const normalized = ref.startsWith('@') ? ref : `@${ref}`;\n const selector = `[data-bv-ref=\"${escapeSelector(normalized)}\"]`;\n const found = document.querySelector(selector);\n if (found) {\n return found;\n }\n const fallback = recoverElementBySnapshotRef(normalized, {\n findByRole,\n });\n if (fallback) {\n return fallback;\n }\n }\n const testid = locator.testid;\n if (typeof testid === 'string' && testid.length > 0) {\n const selector = `[data-testid=\"${escapeSelector(testid)}\"]`;\n const found = scoreCandidates(\n Array.from(document.querySelectorAll(selector))\n );\n if (found) {\n return found;\n }\n }\n const css = locator.css;\n if (typeof css === 'string' && css.length > 0) {\n const found = scoreCandidates(Array.from(document.querySelectorAll(css)));\n if (found) {\n return found;\n }\n }\n const byRole = findByRole(locator);\n if (byRole) {\n return byRole;\n }\n const text = locator.text;\n if (typeof text === 'string' && text.length > 0) {\n return findByText(text);\n }\n return null;\n };\n\n const coerceBoolean = (value: string | boolean): boolean => {\n if (typeof value === 'boolean') {\n return value;\n }\n const normalized = value.trim().toLowerCase();\n return ['true', '1', 'yes', 'y', 'on', 'checked'].includes(normalized);\n };\n\n const dispatchValueEvents = (element: HTMLElement): void => {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n };\n\n const selectOption = (select: HTMLSelectElement, value: string): boolean => {\n const option = Array.from(select.options).find(\n (entry) => entry.value === value || entry.text === value\n );\n if (!option) {\n return false;\n }\n select.value = option.value;\n dispatchValueEvents(select);\n return true;\n };\n\n const selectOptionByIndex = (\n select: HTMLSelectElement,\n index: number\n ): boolean => {\n if (!Number.isInteger(index)) {\n return false;\n }\n if (index < 0 || index >= select.options.length) {\n return false;\n }\n select.selectedIndex = index;\n dispatchValueEvents(select);\n return true;\n };\n\n const setTextValue = (\n element: HTMLElement,\n value: string,\n clear: boolean\n ): boolean => {\n const tag = element.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = element as HTMLInputElement | HTMLTextAreaElement;\n if (clear) {\n input.value = '';\n }\n input.value = `${input.value}${value}`;\n dispatchValueEvents(input);\n return true;\n }\n if (element.isContentEditable) {\n if (clear) {\n element.textContent = '';\n }\n element.textContent = `${element.textContent ?? ''}${value}`;\n dispatchValueEvents(element);\n return true;\n }\n return false;\n };\n\n const detectFieldType = (\n element: Element\n ): 'text' | 'select' | 'checkbox' | 'radio' | 'contentEditable' => {\n if (element instanceof HTMLSelectElement) {\n return 'select';\n }\n if (element instanceof HTMLInputElement) {\n const type = element.type.toLowerCase();\n if (type === 'checkbox') {\n return 'checkbox';\n }\n if (type === 'radio') {\n return 'radio';\n }\n return 'text';\n }\n if (element instanceof HTMLTextAreaElement) {\n return 'text';\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n return 'contentEditable';\n }\n return 'text';\n };\n\n const submitIfRequested = (element: Element): void => {\n const form = element.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else if (element instanceof HTMLElement) {\n element.dispatchEvent(\n new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })\n );\n }\n };\n\n const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => window.setTimeout(resolve, ms));\n\n const dispatchPointer = (\n element: Element,\n type: string,\n x: number,\n y: number\n ): void => {\n element.dispatchEvent(\n new PointerEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n button: 0,\n })\n );\n };\n\n const dispatchDrag = (\n element: Element,\n type: string,\n x: number,\n y: number,\n dataTransfer?: DataTransfer\n ): void => {\n try {\n element.dispatchEvent(\n new DragEvent(type, {\n bubbles: true,\n cancelable: true,\n clientX: x,\n clientY: y,\n dataTransfer,\n })\n );\n } catch {\n element.dispatchEvent(\n new Event(type, { bubbles: true, cancelable: true })\n );\n }\n };\n\n const keyToCode = (key: string): string => {\n const map: Record<string, string> = {\n Enter: 'Enter',\n Tab: 'Tab',\n Escape: 'Escape',\n Esc: 'Escape',\n Backspace: 'Backspace',\n Delete: 'Delete',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n ' ': 'Space',\n Space: 'Space',\n };\n if (map[key]) {\n return map[key];\n }\n if (key.length === 1) {\n if (/[a-zA-Z]/.test(key)) {\n return `Key${key.toUpperCase()}`;\n }\n if (/[0-9]/.test(key)) {\n return `Digit${key}`;\n }\n }\n return key;\n };\n\n const normalizeModifiers = (\n modifiers: unknown\n ): { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean } => {\n const state = { ctrl: false, alt: false, shift: false, meta: false };\n if (Array.isArray(modifiers)) {\n modifiers.forEach((modifier) => {\n if (typeof modifier !== 'string') {\n return;\n }\n const normalized = modifier.toLowerCase();\n if (normalized === 'ctrl') {\n state.ctrl = true;\n } else if (normalized === 'alt') {\n state.alt = true;\n } else if (normalized === 'shift') {\n state.shift = true;\n } else if (normalized === 'meta') {\n state.meta = true;\n }\n });\n return state;\n }\n if (modifiers && typeof modifiers === 'object') {\n const record = modifiers as Record<string, unknown>;\n state.ctrl = Boolean(record.ctrl);\n state.alt = Boolean(record.alt);\n state.shift = Boolean(record.shift);\n state.meta = Boolean(record.meta);\n }\n return state;\n };\n\n const activeEditableElement = (): HTMLElement | null => {\n const active = document.activeElement;\n if (!active || !(active instanceof HTMLElement)) {\n return null;\n }\n const tag = active.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || active.isContentEditable) {\n return active;\n }\n return null;\n };\n\n const parseParams = (): Record<string, unknown> => params ?? {};\n\n try {\n switch (action) {\n case AGENT_TAB_BRANDING_ACTION: {\n const { favicon_url: faviconUrl } = parseParams();\n if (typeof faviconUrl !== 'string' || faviconUrl.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'favicon_url must be a non-empty string.'\n );\n }\n applyAgentTabFavicon(faviconUrl);\n return ok();\n }\n case 'drive.navigate': {\n const { url } = parseParams();\n if (typeof url !== 'string' || url.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'url must be a non-empty string.'\n );\n }\n window.location.href = url;\n return ok();\n }\n case 'drive.locator_point': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const targetState = readPopupTriggerState(target);\n const point = getHittablePoint(target, {\n preferDirectHit: targetState !== null,\n });\n return ok({\n x: point.x,\n y: point.y,\n ...(targetState ? { target_state: targetState } : {}),\n });\n }\n case 'drive.focus_locator': {\n const { locator } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n try {\n target.focus({ preventScroll: true });\n } catch {\n target.focus();\n }\n return ok();\n }\n case 'drive.snapshot_html': {\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.type_target_point': {\n const { locator } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n target = activeEditableElement();\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const tag = target.tagName.toLowerCase();\n if (\n tag !== 'input' &&\n tag !== 'textarea' &&\n !target.isContentEditable\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n const rect = target.getBoundingClientRect();\n return ok({\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n });\n }\n case 'drive.clear_active_editable': {\n const target = activeEditableElement();\n if (!target) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No active editable target to clear.'\n );\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n input.value = '';\n dispatchValueEvents(input);\n return ok({ ok: true });\n }\n if (target.isContentEditable) {\n target.textContent = '';\n dispatchValueEvents(target);\n return ok({ ok: true });\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'Active target is not editable (input, textarea, or contenteditable).'\n );\n }\n case 'drive.click': {\n const { locator, click_count } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const count =\n typeof click_count === 'number' && Number.isFinite(click_count)\n ? Math.max(1, Math.floor(click_count))\n : 1;\n const strategy = selectClickStrategy(target);\n if (strategy.kind === 'popup_trigger') {\n return await executePopupTriggerClick({\n target,\n beforeState: strategy.state,\n clickCount: count,\n locationBefore: window.location.href,\n sleep,\n });\n }\n return executeGenericClick({\n target,\n clickCount: count,\n });\n }\n case 'drive.hover': {\n const { locator, delay_ms } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const eventInit = {\n bubbles: true,\n cancelable: true,\n clientX: centerX,\n clientY: centerY,\n };\n target.dispatchEvent(new MouseEvent('mouseover', eventInit));\n target.dispatchEvent(\n new MouseEvent('mouseenter', { ...eventInit, bubbles: false })\n );\n target.dispatchEvent(new MouseEvent('mousemove', eventInit));\n if (typeof delay_ms === 'number' && Number.isFinite(delay_ms)) {\n const waitMs = Math.min(Math.max(delay_ms, 0), 10000);\n if (waitMs > 0) {\n await sleep(waitMs);\n }\n }\n const html = document.documentElement?.outerHTML ?? '';\n return ok({ format: 'html', snapshot: html });\n }\n case 'drive.select': {\n const { locator, value, text, index } = parseParams();\n const target = resolveLocator(locator as Record<string, unknown>);\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n if (!(target instanceof HTMLSelectElement)) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not a select element.'\n );\n }\n let applied = false;\n if (typeof index === 'number' && Number.isFinite(index)) {\n applied = selectOptionByIndex(target, Math.trunc(index));\n }\n if (!applied && typeof value === 'string') {\n applied = selectOption(target, value);\n }\n if (!applied && typeof text === 'string') {\n applied = selectOption(target, text);\n }\n if (!applied) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'No matching option found for select.'\n );\n }\n return ok();\n }\n case 'drive.type': {\n const { locator, text, clear, submit } = parseParams();\n if (typeof text !== 'string') {\n return buildError('INVALID_ARGUMENT', 'text must be a string.');\n }\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target) {\n const active = activeEditableElement();\n if (active) {\n target = active;\n }\n }\n if (!target || !(target instanceof HTMLElement)) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n target.focus();\n const tag = target.tagName.toLowerCase();\n const shouldClear = Boolean(clear);\n if (tag === 'input' || tag === 'textarea') {\n const input = target as HTMLInputElement | HTMLTextAreaElement;\n if (shouldClear) {\n input.value = '';\n }\n input.value = `${input.value}${text}`;\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (target.isContentEditable) {\n if (shouldClear) {\n target.textContent = '';\n }\n target.textContent = `${target.textContent ?? ''}${text}`;\n target.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n return buildError(\n 'INVALID_ARGUMENT',\n 'Target is not editable (input, textarea, or contenteditable).'\n );\n }\n\n if (submit) {\n const form = target.closest('form');\n if (form && form instanceof HTMLFormElement) {\n form.requestSubmit();\n } else {\n target.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Enter',\n bubbles: true,\n })\n );\n }\n }\n\n return ok();\n }\n case 'drive.detect_field_type': {\n const { locator, selector } = parseParams();\n let target = resolveLocator(\n locator as Record<string, unknown> | undefined\n );\n if (!target && typeof selector === 'string' && selector.length > 0) {\n target = document.querySelector(selector);\n }\n if (!target) {\n return buildError('LOCATOR_NOT_FOUND', 'Failed to resolve locator.');\n }\n return ok({ fieldType: detectFieldType(target) });\n }\n case 'drive.fill_form': {\n const { fields } = parseParams();\n if (!Array.isArray(fields) || fields.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'fields must be a non-empty array.'\n );\n }\n let filled = 0;\n const errors: string[] = [];\n fields.forEach((field, index) => {\n if (!field || typeof field !== 'object') {\n errors.push(`Field ${index} is not an object.`);\n return;\n }\n const record = field as Record<string, unknown>;\n const selector = record.selector;\n const locator =\n record.locator && typeof record.locator === 'object'\n ? (record.locator as Record<string, unknown>)\n : undefined;\n let element: Element | null = null;\n if (locator) {\n element = resolveLocator(locator);\n }\n if (!element && typeof selector === 'string' && selector.length > 0) {\n element = document.querySelector(selector);\n }\n if (!element) {\n errors.push(`Field ${index} could not be resolved.`);\n return;\n }\n\n const value = record.value;\n if (typeof value !== 'string' && typeof value !== 'boolean') {\n errors.push(`Field ${index} has invalid value.`);\n return;\n }\n\n const type =\n typeof record.type === 'string' && record.type.length > 0\n ? record.type\n : 'auto';\n const resolvedType =\n type === 'auto' ? detectFieldType(element) : type;\n const submit = Boolean(record.submit);\n\n let applied = false;\n if (resolvedType === 'select') {\n if (element instanceof HTMLSelectElement) {\n applied = selectOption(element, String(value));\n }\n } else if (resolvedType === 'checkbox' || resolvedType === 'radio') {\n if (element instanceof HTMLInputElement) {\n const shouldCheck =\n typeof value === 'boolean' ? value : coerceBoolean(value);\n element.checked = shouldCheck;\n dispatchValueEvents(element);\n applied = true;\n }\n } else {\n if (element instanceof HTMLElement) {\n applied = setTextValue(element, String(value), true);\n }\n }\n\n if (!applied) {\n errors.push(`Field ${index} could not be filled.`);\n return;\n }\n\n if (submit) {\n submitIfRequested(element);\n }\n filled += 1;\n });\n\n return ok({\n filled,\n attempted: fields.length,\n errors: errors.length > 0 ? errors : [],\n });\n }\n case 'drive.drag': {\n const { from, to, steps } = parseParams();\n const fromEl = resolveLocator(from as Record<string, unknown>);\n if (!fromEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag source.'\n );\n }\n const toEl = resolveLocator(to as Record<string, unknown>);\n if (!toEl) {\n return buildError(\n 'LOCATOR_NOT_FOUND',\n 'Failed to resolve drag target.'\n );\n }\n\n const fromRect = fromEl.getBoundingClientRect();\n const toRect = toEl.getBoundingClientRect();\n const startX = fromRect.left + fromRect.width / 2;\n const startY = fromRect.top + fromRect.height / 2;\n const endX = toRect.left + toRect.width / 2;\n const endY = toRect.top + toRect.height / 2;\n // Defensive bounds in case content script receives unvalidated inputs.\n const totalSteps =\n typeof steps === 'number' && Number.isFinite(steps)\n ? Math.max(1, Math.min(50, Math.floor(steps)))\n : 12;\n let dataTransfer: DataTransfer | undefined;\n try {\n dataTransfer = new DataTransfer();\n } catch {\n dataTransfer = undefined;\n }\n\n dispatchPointer(fromEl, 'pointerdown', startX, startY);\n dispatchDrag(fromEl, 'dragstart', startX, startY, dataTransfer);\n\n for (let i = 1; i <= totalSteps; i += 1) {\n const progress = i / totalSteps;\n const x = startX + (endX - startX) * progress;\n const y = startY + (endY - startY) * progress;\n const target = document.elementFromPoint(x, y) ?? toEl;\n dispatchPointer(target, 'pointermove', x, y);\n dispatchDrag(target, 'dragover', x, y, dataTransfer);\n await sleep(10);\n }\n\n const dropTarget = document.elementFromPoint(endX, endY) ?? toEl;\n dispatchDrag(dropTarget, 'drop', endX, endY, dataTransfer);\n dispatchPointer(dropTarget, 'pointerup', endX, endY);\n dispatchDrag(fromEl, 'dragend', endX, endY, dataTransfer);\n return ok();\n }\n case 'drive.key_press': {\n const { key, modifiers } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n return ok();\n }\n case 'drive.key': {\n const { key, modifiers, repeat } = parseParams();\n if (typeof key !== 'string' || key.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'key must be a non-empty string.'\n );\n }\n const target =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : document.body;\n if (!target) {\n return buildError('INVALID_ARGUMENT', 'No target for key press.');\n }\n const mods = normalizeModifiers(modifiers);\n const eventInit = {\n key,\n code: keyToCode(key),\n bubbles: true,\n cancelable: true,\n ctrlKey: mods.ctrl,\n altKey: mods.alt,\n shiftKey: mods.shift,\n metaKey: mods.meta,\n };\n const count =\n typeof repeat === 'number' && Number.isFinite(repeat)\n ? Math.max(1, Math.min(50, Math.floor(repeat)))\n : 1;\n for (let i = 0; i < count; i += 1) {\n target.dispatchEvent(new KeyboardEvent('keydown', eventInit));\n target.dispatchEvent(new KeyboardEvent('keyup', eventInit));\n }\n return ok();\n }\n case 'drive.scroll': {\n const { delta_x, delta_y, top, left, behavior } = parseParams();\n const scrollBehavior =\n behavior === 'smooth' || behavior === 'auto' ? behavior : undefined;\n if (typeof top === 'number' || typeof left === 'number') {\n window.scrollTo({\n top: typeof top === 'number' ? top : undefined,\n left: typeof left === 'number' ? left : undefined,\n behavior: scrollBehavior,\n });\n return ok();\n }\n if (typeof delta_x === 'number' || typeof delta_y === 'number') {\n window.scrollBy({\n left: typeof delta_x === 'number' ? delta_x : 0,\n top: typeof delta_y === 'number' ? delta_y : 0,\n behavior: scrollBehavior,\n });\n return ok();\n }\n return buildError(\n 'INVALID_ARGUMENT',\n 'scroll requires delta_x/delta_y or top/left.'\n );\n }\n case 'drive.screenshot_meta': {\n const root = document.documentElement;\n const body = document.body;\n const scrollWidth = Math.max(\n root?.scrollWidth ?? 0,\n root?.clientWidth ?? 0,\n body?.scrollWidth ?? 0,\n body?.clientWidth ?? 0\n );\n const scrollHeight = Math.max(\n root?.scrollHeight ?? 0,\n root?.clientHeight ?? 0,\n body?.scrollHeight ?? 0,\n body?.clientHeight ?? 0\n );\n\n return ok({\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollWidth,\n scrollHeight,\n devicePixelRatio:\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1,\n });\n }\n case 'drive.screenshot_element': {\n const { selector } = parseParams();\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a non-empty string.'\n );\n }\n\n let element: Element | null = null;\n try {\n element = document.querySelector(selector);\n } catch {\n return buildError(\n 'INVALID_ARGUMENT',\n 'selector must be a valid CSS selector.'\n );\n }\n\n if (!element) {\n return buildError('INVALID_ARGUMENT', 'No element matched selector.');\n }\n\n try {\n (element as HTMLElement).scrollIntoView?.({\n block: 'center',\n inline: 'center',\n });\n } catch {\n // Ignore scroll failures; capture whatever is visible.\n }\n\n const rect = element.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n const dpr =\n typeof window.devicePixelRatio === 'number' &&\n Number.isFinite(window.devicePixelRatio) &&\n window.devicePixelRatio > 0\n ? window.devicePixelRatio\n : 1;\n\n return ok({\n selector,\n pageX: rect.left + scrollX,\n pageY: rect.top + scrollY,\n width: rect.width,\n height: rect.height,\n viewportLeft: rect.left,\n viewportTop: rect.top,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollX,\n scrollY,\n devicePixelRatio: dpr,\n });\n }\n case 'drive.wait_for': {\n const { condition, timeout_ms } = parseParams();\n if (!condition || typeof condition !== 'object') {\n return buildError('INVALID_ARGUMENT', 'condition must be an object.');\n }\n const kind = (condition as Record<string, unknown>).kind;\n const value = (condition as Record<string, unknown>).value;\n if (\n typeof kind !== 'string' ||\n !['locator_visible', 'text_present', 'url_matches'].includes(kind)\n ) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.kind must be locator_visible, text_present, or url_matches.'\n );\n }\n if (typeof value !== 'string' || value.length === 0) {\n return buildError(\n 'INVALID_ARGUMENT',\n 'condition.value must be a non-empty string.'\n );\n }\n const timeout =\n typeof timeout_ms === 'number' && Number.isFinite(timeout_ms)\n ? Math.max(0, timeout_ms)\n : 30000;\n const start = Date.now();\n const urlMatcher =\n kind === 'url_matches' ? buildUrlMatcher(value) : null;\n if (urlMatcher && !urlMatcher.ok) {\n return urlMatcher.error;\n }\n\n const checkCondition = (): boolean => {\n if (kind === 'text_present') {\n return getRenderedText(document.body).includes(\n normalizeText(value)\n );\n }\n if (kind === 'url_matches') {\n return urlMatcher\n ? urlMatcher.matcher(window.location.href)\n : window.location.href.includes(value);\n }\n const selector = value;\n const element = document.querySelector(selector);\n return Boolean(element && isVisible(element));\n };\n\n return await new Promise<ContentResult>((resolve) => {\n const tick = () => {\n if (checkCondition()) {\n resolve(ok());\n return;\n }\n if (Date.now() - start >= timeout) {\n resolve(\n buildError('TIMEOUT', `wait_for timed out after ${timeout}ms.`)\n );\n return;\n }\n window.setTimeout(tick, 100);\n };\n tick();\n });\n }\n case 'drive.go_back': {\n // Trigger history changes on the next tick so the background script gets\n // our response before this page unloads.\n window.setTimeout(() => {\n history.back();\n }, 0);\n return ok();\n }\n case 'drive.go_forward': {\n window.setTimeout(() => {\n history.forward();\n }, 0);\n return ok();\n }\n default:\n return buildError('INVALID_ARGUMENT', `Unsupported action ${action}.`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return buildError('EVALUATION_FAILED', message);\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst contentListenerInstalled = (() => {\n const target = globalThis as typeof globalThis & {\n [CONTENT_LISTENER_MARKER]?: boolean;\n };\n if (target[CONTENT_LISTENER_MARKER]) {\n return true;\n }\n target[CONTENT_LISTENER_MARKER] = true;\n return false;\n})();\n\nif (\n typeof chrome !== 'undefined' &&\n chrome.runtime?.onMessage &&\n !contentListenerInstalled\n) {\n chrome.runtime.onMessage.addListener(\n (\n message: Record<string, unknown>,\n _sender: unknown,\n sendResponse: (response: ContentResult) => void\n ) => {\n if (!isRecord(message) || typeof message.action !== 'string') {\n sendResponse({\n ok: false,\n error: {\n code: 'INVALID_ARGUMENT',\n message: 'Invalid content script request.',\n retryable: false,\n },\n });\n return;\n }\n\n void runDriveAction(\n message.action,\n message.params as Record<string, unknown>\n )\n .then(sendResponse)\n .catch((error) => {\n const messageText =\n error instanceof Error ? error.message : 'Unknown error';\n sendResponse({\n ok: false,\n error: {\n code: 'EVALUATION_FAILED',\n message: messageText,\n retryable: false,\n },\n });\n });\n\n return true;\n }\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["isVisible", "link"]
|
|
7
7
|
}
|