bb-browser 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"background.js","sources":["../src/background/constants.ts","../src/background/sse-client.ts","../src/background/api-client.ts","../src/background/cdp-service.ts","../src/background/dom-service.ts","../src/background/cdp-dom-service.ts","../src/background/trace-service.ts","../src/background/command-handler.ts","../src/background/index.ts"],"sourcesContent":["/**\n * bb-browser Extension Constants\n */\n\nexport const DAEMON_PORT = 19824;\nexport const DAEMON_HOST = 'localhost';\nexport const DAEMON_BASE_URL = `http://${DAEMON_HOST}:${DAEMON_PORT}`;\n\nexport const SSE_RECONNECT_DELAY = 3000; // 3 秒\nexport const SSE_MAX_RECONNECT_ATTEMPTS = 5;\n","/**\n * SSE Client for bb-browser Extension\n * 使用 fetch + ReadableStream 实现,兼容 Service Worker (Manifest V3)\n */\n\nimport { DAEMON_BASE_URL, SSE_RECONNECT_DELAY, SSE_MAX_RECONNECT_ATTEMPTS } from './constants';\n\nexport interface SSEEvent {\n type: 'connected' | 'heartbeat' | 'command';\n data: unknown;\n}\n\nexport interface CommandEvent {\n id: string;\n action: string;\n [key: string]: unknown;\n}\n\nexport type CommandHandler = (command: CommandEvent) => void | Promise<void>;\n\nexport class SSEClient {\n private abortController: AbortController | null = null;\n private reconnectAttempts = 0;\n private isConnectedFlag = false;\n private onCommandHandler: CommandHandler | null = null;\n\n /**\n * 连接到 Daemon SSE 端点\n */\n async connect(): Promise<void> {\n if (this.abortController) {\n console.warn('[SSEClient] Already connected');\n return;\n }\n\n const sseUrl = `${DAEMON_BASE_URL}/sse`;\n console.log('[SSEClient] Connecting to:', sseUrl);\n this.abortController = new AbortController();\n\n try {\n const response = await fetch(sseUrl, {\n signal: this.abortController.signal,\n headers: {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n },\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const contentType = response.headers.get('Content-Type');\n console.log('[SSEClient] Connection established, Content-Type:', contentType);\n\n this.isConnectedFlag = true;\n this.reconnectAttempts = 0;\n\n await this.readStream(response.body);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('[SSEClient] Connection aborted');\n return;\n }\n\n console.error('[SSEClient] Connection error:', error);\n this.isConnectedFlag = false;\n this.reconnect();\n }\n }\n\n /**\n * 读取并解析 SSE 流\n */\n private async readStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let event = '';\n let data = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n console.log('[SSEClient] Stream ended');\n this.isConnectedFlag = false;\n this.reconnect();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (trimmedLine.startsWith('event:')) {\n event = trimmedLine.substring(6).trim();\n } else if (trimmedLine.startsWith('data:')) {\n data = trimmedLine.substring(5).trim();\n } else if (trimmedLine === '') {\n if (event && data) {\n // 不 await,允许多个命令并发执行\n this.handleMessage(event, data).catch(err =>\n console.error('[SSEClient] handleMessage error:', err)\n );\n event = '';\n data = '';\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('[SSEClient] Stream reading aborted');\n return;\n }\n console.error('[SSEClient] Stream reading error:', error);\n this.isConnectedFlag = false;\n this.reconnect();\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * 处理 SSE 消息\n */\n private async handleMessage(event: string, data: string): Promise<void> {\n try {\n const parsed = JSON.parse(data);\n\n switch (event) {\n case 'connected':\n console.log('[SSEClient] Connection confirmed:', parsed);\n break;\n\n case 'heartbeat':\n console.log('[SSEClient] Heartbeat:', new Date(parsed.time * 1000).toISOString());\n break;\n\n case 'command':\n console.log('[SSEClient] Command received:', parsed.id, parsed.action);\n if (this.onCommandHandler) {\n await this.onCommandHandler(parsed as CommandEvent);\n } else {\n console.warn('[SSEClient] No command handler registered');\n }\n break;\n\n default:\n console.log('[SSEClient] Unknown event type:', event);\n }\n } catch (error) {\n console.error('[SSEClient] Error handling message:', error);\n }\n }\n\n /**\n * 指数退避重连\n */\n private reconnect(): void {\n if (this.reconnectAttempts >= SSE_MAX_RECONNECT_ATTEMPTS) {\n console.error('[SSEClient] Max reconnection attempts reached');\n return;\n }\n\n this.reconnectAttempts++;\n const delay = SSE_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[SSEClient] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${SSE_MAX_RECONNECT_ATTEMPTS})`\n );\n\n setTimeout(() => {\n this.disconnect();\n this.connect();\n }, delay);\n }\n\n /**\n * 注册命令处理器\n */\n onCommand(handler: CommandHandler): void {\n this.onCommandHandler = handler;\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n if (this.abortController) {\n console.log('[SSEClient] Disconnecting...');\n this.abortController.abort();\n this.abortController = null;\n this.isConnectedFlag = false;\n }\n }\n\n /**\n * 检查连接状态\n */\n isConnected(): boolean {\n return this.isConnectedFlag;\n }\n}\n","/**\n * API Client for bb-browser Extension\n * 负责向 Daemon 回传命令执行结果\n */\n\nimport { DAEMON_BASE_URL } from './constants';\n\nexport interface CommandResult {\n id: string;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * 向 Daemon 发送命令执行结果\n */\nexport async function sendResult(result: CommandResult): Promise<void> {\n const url = `${DAEMON_BASE_URL}/result`;\n console.log('[APIClient] Sending result:', result.id, result.success);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(result),\n });\n\n if (!response.ok) {\n console.error('[APIClient] Failed to send result:', response.status, response.statusText);\n return;\n }\n\n const data = await response.json();\n console.log('[APIClient] Result sent successfully:', data);\n } catch (error) {\n console.error('[APIClient] Error sending result:', error);\n }\n}\n","/**\n * CDP Service for bb-browser Extension\n * \n * 封装 chrome.debugger API,提供统一的 CDP 调用接口。\n * 所有 DOM 操作、输入模拟、脚本执行都通过这个服务层进行。\n */\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** CDP 命令结果的基础类型 */\ninterface CDPResult {\n [key: string]: unknown;\n}\n\n/** Runtime.evaluate 的结果 */\ninterface RuntimeEvaluateResult {\n result?: {\n type: string;\n value?: unknown;\n objectId?: string;\n description?: string;\n subtype?: string;\n };\n exceptionDetails?: {\n exception?: { description?: string };\n text?: string;\n };\n}\n\n/** DOM.getDocument 的结果 */\ninterface DOMGetDocumentResult {\n root: {\n nodeId: number;\n backendNodeId: number;\n nodeType: number;\n nodeName: string;\n childNodeCount?: number;\n children?: DOMNode[];\n };\n}\n\n/** DOM 节点类型 */\ninterface DOMNode {\n nodeId: number;\n backendNodeId: number;\n nodeType: number;\n nodeName: string;\n localName?: string;\n nodeValue?: string;\n childNodeCount?: number;\n children?: DOMNode[];\n attributes?: string[];\n frameId?: string;\n contentDocument?: DOMNode;\n shadowRoots?: DOMNode[];\n}\n\n/** DOM.querySelector 的结果 */\ninterface DOMQuerySelectorResult {\n nodeId: number;\n}\n\n/** DOM.getBoxModel 的结果 */\ninterface DOMGetBoxModelResult {\n model: {\n content: number[]; // [x1, y1, x2, y2, x3, y3, x4, y4]\n padding: number[];\n border: number[];\n margin: number[];\n width: number;\n height: number;\n };\n}\n\n/** DOM.resolveNode 的结果 */\ninterface DOMResolveNodeResult {\n object: {\n type: string;\n objectId?: string;\n className?: string;\n description?: string;\n };\n}\n\n/** Page.captureScreenshot 的结果 */\ninterface PageCaptureScreenshotResult {\n data: string; // base64 encoded\n}\n\n/** Accessibility.getFullAXTree 的结果 */\ninterface AccessibilityGetFullAXTreeResult {\n nodes: AXNode[];\n}\n\n/** 可访问性树节点 */\nexport interface AXNode {\n nodeId: string;\n ignored: boolean;\n role?: { type: string; value?: string };\n name?: { type: string; value?: string; sources?: unknown[] };\n description?: { type: string; value?: string };\n value?: { type: string; value?: unknown };\n properties?: Array<{\n name: string;\n value: { type: string; value?: unknown };\n }>;\n childIds?: string[];\n backendDOMNodeId?: number;\n frameId?: string;\n}\n\n/** Dialog 信息 */\nexport interface DialogInfo {\n url: string;\n message: string;\n type: 'alert' | 'confirm' | 'prompt' | 'beforeunload';\n defaultPrompt?: string;\n hasBrowserHandler: boolean;\n}\n\n/** 网络请求信息 */\nexport interface NetworkRequest {\n requestId: string;\n url: string;\n method: string;\n type: string;\n timestamp: number;\n headers?: Record<string, string>;\n postData?: string;\n response?: {\n status: number;\n statusText: string;\n headers?: Record<string, string>;\n mimeType?: string;\n };\n failed?: boolean;\n failureReason?: string;\n}\n\n/** 控制台消息 */\nexport interface ConsoleMessage {\n type: 'log' | 'info' | 'warn' | 'error' | 'debug';\n text: string;\n timestamp: number;\n url?: string;\n lineNumber?: number;\n}\n\n/** JS 异常错误 */\nexport interface JSError {\n message: string;\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: string;\n timestamp: number;\n}\n\n/** 网络拦截规则 */\nexport interface NetworkRoute {\n urlPattern: string;\n action: 'abort' | 'continue' | 'fulfill';\n body?: string;\n status?: number;\n headers?: Record<string, string>;\n}\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 已 attach 的 tab 集合 */\nconst attachedTabs = new Set<number>();\n\n/** 待处理的 dialog 信息 */\nconst pendingDialogs = new Map<number, DialogInfo>();\n\n/** 网络请求记录(每个 tab 最多保留 500 条) */\nconst networkRequests = new Map<number, NetworkRequest[]>();\n\n/** 控制台消息记录(每个 tab 最多保留 500 条) */\nconst consoleMessages = new Map<number, ConsoleMessage[]>();\n\n/** JS 错误记录(每个 tab 最多保留 100 条) */\nconst jsErrors = new Map<number, JSError[]>();\n\n/** 网络拦截规则 */\nconst networkRoutes = new Map<number, NetworkRoute[]>();\n\n/** 是否已启用网络监控的 tab */\nconst networkEnabledTabs = new Set<number>();\n\nconst MAX_REQUESTS = 500;\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_ERRORS = 100;\n\n// ============================================================================\n// 核心 CDP 调用\n// ============================================================================\n\n/**\n * 确保 debugger 已附加到指定 tab\n */\nexport async function ensureAttached(tabId: number): Promise<void> {\n if (attachedTabs.has(tabId)) {\n return;\n }\n\n try {\n await chrome.debugger.attach({ tabId }, '1.3');\n attachedTabs.add(tabId);\n \n // 启用必要的 CDP 域\n await chrome.debugger.sendCommand({ tabId }, 'Page.enable');\n await chrome.debugger.sendCommand({ tabId }, 'DOM.enable');\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.enable');\n \n console.log('[CDPService] Attached to tab:', tabId);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n // 如果已经 attached,忽略错误\n if (msg.includes('Another debugger is already attached')) {\n attachedTabs.add(tabId);\n return;\n }\n throw error;\n }\n}\n\n/**\n * 从 tab 分离 debugger\n */\nexport async function detach(tabId: number): Promise<void> {\n if (!attachedTabs.has(tabId)) {\n return;\n }\n\n try {\n await chrome.debugger.detach({ tabId });\n attachedTabs.delete(tabId);\n pendingDialogs.delete(tabId);\n console.log('[CDPService] Detached from tab:', tabId);\n } catch (error) {\n // 忽略 detach 错误\n attachedTabs.delete(tabId);\n }\n}\n\n/**\n * 发送 CDP 命令\n */\nexport async function sendCommand<T = CDPResult>(\n tabId: number,\n method: string,\n params?: object\n): Promise<T> {\n await ensureAttached(tabId);\n const result = await chrome.debugger.sendCommand({ tabId }, method, params);\n return result as T;\n}\n\n// ============================================================================\n// Runtime 域 - JavaScript 执行\n// ============================================================================\n\n/**\n * 在页面中执行 JavaScript 表达式\n */\nexport async function evaluate(\n tabId: number,\n expression: string,\n options: {\n returnByValue?: boolean;\n awaitPromise?: boolean;\n } = {}\n): Promise<unknown> {\n const result = await sendCommand<RuntimeEvaluateResult>(tabId, 'Runtime.evaluate', {\n expression,\n returnByValue: options.returnByValue ?? true,\n awaitPromise: options.awaitPromise ?? true,\n });\n\n if (result.exceptionDetails) {\n const errorMsg = result.exceptionDetails.exception?.description\n || result.exceptionDetails.text\n || 'Unknown error';\n throw new Error(`Eval error: ${errorMsg}`);\n }\n\n return result.result?.value;\n}\n\n/**\n * 调用对象上的函数\n */\nexport async function callFunctionOn(\n tabId: number,\n objectId: string,\n functionDeclaration: string,\n args: unknown[] = []\n): Promise<unknown> {\n const result = await sendCommand<RuntimeEvaluateResult>(tabId, 'Runtime.callFunctionOn', {\n objectId,\n functionDeclaration,\n arguments: args.map(arg => ({ value: arg })),\n returnByValue: true,\n awaitPromise: true,\n });\n\n if (result.exceptionDetails) {\n throw new Error(result.exceptionDetails.exception?.description || 'Call failed');\n }\n\n return result.result?.value;\n}\n\n// ============================================================================\n// DOM 域 - DOM 操作\n// ============================================================================\n\n/**\n * 获取文档根节点\n */\nexport async function getDocument(\n tabId: number,\n options: { depth?: number; pierce?: boolean } = {}\n): Promise<DOMNode> {\n const result = await sendCommand<DOMGetDocumentResult>(tabId, 'DOM.getDocument', {\n depth: options.depth ?? -1, // -1 表示获取整个树\n pierce: options.pierce ?? true, // 穿透 shadow DOM 和 iframe\n });\n return result.root;\n}\n\n/**\n * 使用选择器查询元素\n */\nexport async function querySelector(\n tabId: number,\n nodeId: number,\n selector: string\n): Promise<number> {\n const result = await sendCommand<DOMQuerySelectorResult>(tabId, 'DOM.querySelector', {\n nodeId,\n selector,\n });\n return result.nodeId;\n}\n\n/**\n * 获取元素的盒模型(用于计算点击位置)\n */\nexport async function getBoxModel(tabId: number, nodeId: number): Promise<DOMGetBoxModelResult['model']> {\n const result = await sendCommand<DOMGetBoxModelResult>(tabId, 'DOM.getBoxModel', {\n nodeId,\n });\n return result.model;\n}\n\n/**\n * 获取元素的盒模型(通过 backendNodeId)\n */\nexport async function getBoxModelByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<DOMGetBoxModelResult['model']> {\n const result = await sendCommand<DOMGetBoxModelResult>(tabId, 'DOM.getBoxModel', {\n backendNodeId,\n });\n return result.model;\n}\n\n/**\n * 将 nodeId 解析为 Runtime 对象\n */\nexport async function resolveNode(tabId: number, nodeId: number): Promise<string | undefined> {\n const result = await sendCommand<DOMResolveNodeResult>(tabId, 'DOM.resolveNode', {\n nodeId,\n });\n return result.object.objectId;\n}\n\n/**\n * 将 backendNodeId 解析为 Runtime 对象\n */\nexport async function resolveNodeByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<string | undefined> {\n const result = await sendCommand<DOMResolveNodeResult>(tabId, 'DOM.resolveNode', {\n backendNodeId,\n });\n return result.object.objectId;\n}\n\n/**\n * 聚焦到指定元素\n */\nexport async function focusElement(tabId: number, nodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.focus', { nodeId });\n}\n\n/**\n * 聚焦到指定元素(通过 backendNodeId)\n */\nexport async function focusElementByBackendId(tabId: number, backendNodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.focus', { backendNodeId });\n}\n\n/**\n * 滚动元素到可视区域\n */\nexport async function scrollIntoViewIfNeeded(tabId: number, nodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.scrollIntoViewIfNeeded', { nodeId });\n}\n\n/**\n * 滚动元素到可视区域(通过 backendNodeId)\n */\nexport async function scrollIntoViewIfNeededByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<void> {\n await sendCommand(tabId, 'DOM.scrollIntoViewIfNeeded', { backendNodeId });\n}\n\n/**\n * 设置元素属性值(用于 input)\n */\nexport async function setAttributeValue(\n tabId: number,\n nodeId: number,\n name: string,\n value: string\n): Promise<void> {\n await sendCommand(tabId, 'DOM.setAttributeValue', { nodeId, name, value });\n}\n\n// ============================================================================\n// Input 域 - 输入模拟\n// ============================================================================\n\n/**\n * 分发鼠标事件\n */\nexport async function dispatchMouseEvent(\n tabId: number,\n type: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel',\n x: number,\n y: number,\n options: {\n button?: 'left' | 'right' | 'middle' | 'none';\n clickCount?: number;\n deltaX?: number;\n deltaY?: number;\n modifiers?: number; // 1=Alt, 2=Ctrl, 4=Meta, 8=Shift\n } = {}\n): Promise<void> {\n await sendCommand(tabId, 'Input.dispatchMouseEvent', {\n type,\n x,\n y,\n button: options.button ?? 'left',\n clickCount: options.clickCount ?? 1,\n deltaX: options.deltaX ?? 0,\n deltaY: options.deltaY ?? 0,\n modifiers: options.modifiers ?? 0,\n });\n}\n\n/**\n * 点击指定坐标\n */\nexport async function click(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 1 });\n}\n\n/**\n * 双击指定坐标\n */\nexport async function doubleClick(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 2 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 2 });\n}\n\n/**\n * 移动鼠标到指定坐标(用于 hover)\n */\nexport async function moveMouse(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mouseMoved', x, y);\n}\n\n/**\n * 滚动鼠标滚轮\n */\nexport async function scroll(\n tabId: number,\n x: number,\n y: number,\n deltaX: number,\n deltaY: number\n): Promise<void> {\n await dispatchMouseEvent(tabId, 'mouseWheel', x, y, { deltaX, deltaY });\n}\n\n/**\n * 分发键盘事件\n */\nexport async function dispatchKeyEvent(\n tabId: number,\n type: 'keyDown' | 'keyUp' | 'rawKeyDown' | 'char',\n options: {\n key?: string;\n code?: string;\n text?: string;\n modifiers?: number;\n windowsVirtualKeyCode?: number;\n nativeVirtualKeyCode?: number;\n } = {}\n): Promise<void> {\n await sendCommand(tabId, 'Input.dispatchKeyEvent', {\n type,\n ...options,\n });\n}\n\n/**\n * 按下并释放一个键\n */\nexport async function pressKey(\n tabId: number,\n key: string,\n options: { modifiers?: number } = {}\n): Promise<void> {\n // 特殊键的虚拟键码映射\n const keyCodeMap: Record<string, number> = {\n Enter: 13,\n Tab: 9,\n Backspace: 8,\n Escape: 27,\n ArrowUp: 38,\n ArrowDown: 40,\n ArrowLeft: 37,\n ArrowRight: 39,\n Delete: 46,\n Home: 36,\n End: 35,\n PageUp: 33,\n PageDown: 34,\n };\n\n const keyCode = keyCodeMap[key] || key.charCodeAt(0);\n\n await dispatchKeyEvent(tabId, 'rawKeyDown', {\n key,\n code: key,\n windowsVirtualKeyCode: keyCode,\n nativeVirtualKeyCode: keyCode,\n modifiers: options.modifiers,\n });\n\n // 对于可打印字符,发送 char 事件\n if (key.length === 1) {\n await dispatchKeyEvent(tabId, 'char', {\n text: key,\n key,\n modifiers: options.modifiers,\n });\n }\n\n await dispatchKeyEvent(tabId, 'keyUp', {\n key,\n code: key,\n windowsVirtualKeyCode: keyCode,\n nativeVirtualKeyCode: keyCode,\n modifiers: options.modifiers,\n });\n}\n\n/**\n * 输入文本(逐字符)\n */\nexport async function insertText(tabId: number, text: string): Promise<void> {\n await sendCommand(tabId, 'Input.insertText', { text });\n}\n\n// ============================================================================\n// Page 域 - 页面操作\n// ============================================================================\n\n/**\n * 截取页面截图\n */\nexport async function captureScreenshot(\n tabId: number,\n options: {\n format?: 'jpeg' | 'png' | 'webp';\n quality?: number;\n clip?: { x: number; y: number; width: number; height: number; scale?: number };\n fromSurface?: boolean;\n captureBeyondViewport?: boolean;\n } = {}\n): Promise<string> {\n const result = await sendCommand<PageCaptureScreenshotResult>(tabId, 'Page.captureScreenshot', {\n format: options.format ?? 'png',\n quality: options.quality,\n clip: options.clip,\n fromSurface: options.fromSurface ?? true,\n captureBeyondViewport: options.captureBeyondViewport ?? false,\n });\n return result.data; // base64 encoded\n}\n\n/**\n * 导航到 URL\n */\nexport async function navigate(tabId: number, url: string): Promise<void> {\n await sendCommand(tabId, 'Page.navigate', { url });\n}\n\n/**\n * 刷新页面\n */\nexport async function reload(tabId: number, ignoreCache = false): Promise<void> {\n await sendCommand(tabId, 'Page.reload', { ignoreCache });\n}\n\n/**\n * 处理 JavaScript 对话框(alert, confirm, prompt)\n */\nexport async function handleJavaScriptDialog(\n tabId: number,\n accept: boolean,\n promptText?: string\n): Promise<void> {\n await sendCommand(tabId, 'Page.handleJavaScriptDialog', {\n accept,\n promptText,\n });\n}\n\n/**\n * 获取待处理的 dialog\n */\nexport function getPendingDialog(tabId: number): DialogInfo | undefined {\n return pendingDialogs.get(tabId);\n}\n\n// ============================================================================\n// Accessibility 域 - 可访问性树\n// ============================================================================\n\n/**\n * 获取完整的可访问性树\n */\nexport async function getFullAccessibilityTree(\n tabId: number,\n options: { depth?: number; frameId?: string } = {}\n): Promise<AXNode[]> {\n // 先启用 Accessibility 域\n await sendCommand(tabId, 'Accessibility.enable');\n \n const result = await sendCommand<AccessibilityGetFullAXTreeResult>(\n tabId,\n 'Accessibility.getFullAXTree',\n {\n depth: options.depth,\n frameId: options.frameId,\n }\n );\n \n return result.nodes;\n}\n\n/**\n * 获取部分可访问性树(从指定节点开始)\n */\nexport async function getPartialAccessibilityTree(\n tabId: number,\n nodeId?: number,\n backendNodeId?: number,\n options: { depth?: number; fetchRelatives?: boolean } = {}\n): Promise<AXNode[]> {\n await sendCommand(tabId, 'Accessibility.enable');\n \n const result = await sendCommand<AccessibilityGetFullAXTreeResult>(\n tabId,\n 'Accessibility.getPartialAXTree',\n {\n nodeId,\n backendNodeId,\n fetchRelatives: options.fetchRelatives ?? true,\n depth: options.depth,\n }\n );\n \n return result.nodes;\n}\n\n// ============================================================================\n// Network 域 - 网络监控和拦截\n// ============================================================================\n\n/**\n * 启用网络监控\n */\nexport async function enableNetwork(tabId: number): Promise<void> {\n if (networkEnabledTabs.has(tabId)) return;\n \n await ensureAttached(tabId);\n await sendCommand(tabId, 'Network.enable');\n await sendCommand(tabId, 'Fetch.enable', {\n patterns: [{ urlPattern: '*' }],\n });\n \n networkEnabledTabs.add(tabId);\n if (!networkRequests.has(tabId)) {\n networkRequests.set(tabId, []);\n }\n \n console.log('[CDPService] Network enabled for tab:', tabId);\n}\n\n/**\n * 禁用网络监控\n */\nexport async function disableNetwork(tabId: number): Promise<void> {\n if (!networkEnabledTabs.has(tabId)) return;\n \n try {\n await sendCommand(tabId, 'Fetch.disable');\n await sendCommand(tabId, 'Network.disable');\n } catch (e) {\n // 忽略错误\n }\n \n networkEnabledTabs.delete(tabId);\n console.log('[CDPService] Network disabled for tab:', tabId);\n}\n\n/**\n * 获取网络请求记录\n */\nexport function getNetworkRequests(tabId: number, filter?: string): NetworkRequest[] {\n const requests = networkRequests.get(tabId) || [];\n if (!filter) return requests;\n \n const lowerFilter = filter.toLowerCase();\n return requests.filter(r => \n r.url.toLowerCase().includes(lowerFilter) ||\n r.method.toLowerCase().includes(lowerFilter) ||\n r.type.toLowerCase().includes(lowerFilter)\n );\n}\n\n/**\n * 清空网络请求记录\n */\nexport function clearNetworkRequests(tabId: number): void {\n networkRequests.set(tabId, []);\n}\n\n/**\n * 添加网络拦截规则\n */\nexport async function addNetworkRoute(\n tabId: number,\n urlPattern: string,\n options: { abort?: boolean; body?: string; status?: number; headers?: Record<string, string> } = {}\n): Promise<void> {\n await enableNetwork(tabId);\n \n const route: NetworkRoute = {\n urlPattern,\n action: options.abort ? 'abort' : (options.body ? 'fulfill' : 'continue'),\n body: options.body,\n status: options.status ?? 200,\n headers: options.headers,\n };\n \n const routes = networkRoutes.get(tabId) || [];\n // 移除同 pattern 的旧规则\n const filtered = routes.filter(r => r.urlPattern !== urlPattern);\n filtered.push(route);\n networkRoutes.set(tabId, filtered);\n \n console.log('[CDPService] Added network route:', route);\n}\n\n/**\n * 移除网络拦截规则\n */\nexport function removeNetworkRoute(tabId: number, urlPattern?: string): void {\n if (!urlPattern) {\n networkRoutes.delete(tabId);\n console.log('[CDPService] Removed all network routes for tab:', tabId);\n } else {\n const routes = networkRoutes.get(tabId) || [];\n networkRoutes.set(tabId, routes.filter(r => r.urlPattern !== urlPattern));\n console.log('[CDPService] Removed network route:', urlPattern);\n }\n}\n\n/**\n * 获取所有网络拦截规则\n */\nexport function getNetworkRoutes(tabId: number): NetworkRoute[] {\n return networkRoutes.get(tabId) || [];\n}\n\n// ============================================================================\n// Console/Runtime 域 - 控制台和错误监控\n// ============================================================================\n\n/**\n * 启用控制台消息监控\n */\nexport async function enableConsole(tabId: number): Promise<void> {\n await ensureAttached(tabId);\n await sendCommand(tabId, 'Runtime.enable');\n await sendCommand(tabId, 'Log.enable');\n \n if (!consoleMessages.has(tabId)) {\n consoleMessages.set(tabId, []);\n }\n if (!jsErrors.has(tabId)) {\n jsErrors.set(tabId, []);\n }\n \n console.log('[CDPService] Console enabled for tab:', tabId);\n}\n\n/**\n * 获取控制台消息\n */\nexport function getConsoleMessages(tabId: number): ConsoleMessage[] {\n return consoleMessages.get(tabId) || [];\n}\n\n/**\n * 清空控制台消息\n */\nexport function clearConsoleMessages(tabId: number): void {\n consoleMessages.set(tabId, []);\n}\n\n/**\n * 获取 JS 错误\n */\nexport function getJSErrors(tabId: number): JSError[] {\n return jsErrors.get(tabId) || [];\n}\n\n/**\n * 清空 JS 错误\n */\nexport function clearJSErrors(tabId: number): void {\n jsErrors.set(tabId, []);\n}\n\n// ============================================================================\n// 事件处理\n// ============================================================================\n\n/**\n * 初始化 CDP 事件监听\n */\nexport function initEventListeners(): void {\n // 监听 debugger 事件\n chrome.debugger.onEvent.addListener((source, method, params) => {\n const tabId = source.tabId;\n if (!tabId) return;\n \n // Dialog 事件\n if (method === 'Page.javascriptDialogOpening') {\n const dialogParams = params as DialogInfo;\n console.log('[CDPService] Dialog opened:', dialogParams);\n pendingDialogs.set(tabId, dialogParams);\n } else if (method === 'Page.javascriptDialogClosed') {\n console.log('[CDPService] Dialog closed');\n pendingDialogs.delete(tabId);\n }\n \n // Network 事件\n else if (method === 'Network.requestWillBeSent') {\n handleNetworkRequest(tabId, params as NetworkRequestParams);\n } else if (method === 'Network.responseReceived') {\n handleNetworkResponse(tabId, params as NetworkResponseParams);\n } else if (method === 'Network.loadingFailed') {\n handleNetworkFailed(tabId, params as NetworkFailedParams);\n }\n \n // Fetch 拦截事件\n else if (method === 'Fetch.requestPaused') {\n handleFetchPaused(tabId, params as FetchPausedParams);\n }\n \n // Console 事件\n else if (method === 'Runtime.consoleAPICalled') {\n handleConsoleAPI(tabId, params as ConsoleAPIParams);\n } else if (method === 'Log.entryAdded') {\n handleLogEntry(tabId, params as LogEntryParams);\n }\n \n // Runtime 异常事件\n else if (method === 'Runtime.exceptionThrown') {\n handleException(tabId, params as ExceptionParams);\n }\n });\n\n // 当 debugger 被 detach 时清理状态\n chrome.debugger.onDetach.addListener((source) => {\n if (source.tabId) {\n cleanupTab(source.tabId);\n console.log('[CDPService] Debugger detached from tab:', source.tabId);\n }\n });\n\n // 当 tab 关闭时清理状态\n chrome.tabs.onRemoved.addListener((tabId) => {\n cleanupTab(tabId);\n });\n}\n\n/**\n * 清理 tab 相关状态\n */\nfunction cleanupTab(tabId: number): void {\n attachedTabs.delete(tabId);\n pendingDialogs.delete(tabId);\n networkRequests.delete(tabId);\n networkRoutes.delete(tabId);\n networkEnabledTabs.delete(tabId);\n consoleMessages.delete(tabId);\n jsErrors.delete(tabId);\n}\n\n// ============================================================================\n// 事件处理函数 - Network\n// ============================================================================\n\ninterface NetworkRequestParams {\n requestId: string;\n request: {\n url: string;\n method: string;\n headers: Record<string, string>;\n postData?: string;\n };\n type: string;\n timestamp: number;\n}\n\ninterface NetworkResponseParams {\n requestId: string;\n response: {\n url: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n mimeType: string;\n };\n}\n\ninterface NetworkFailedParams {\n requestId: string;\n errorText: string;\n}\n\ninterface FetchPausedParams {\n requestId: string;\n request: {\n url: string;\n method: string;\n };\n}\n\nfunction handleNetworkRequest(tabId: number, params: NetworkRequestParams): void {\n const requests = networkRequests.get(tabId) || [];\n \n // 限制数量\n if (requests.length >= MAX_REQUESTS) {\n requests.shift();\n }\n \n requests.push({\n requestId: params.requestId,\n url: params.request.url,\n method: params.request.method,\n type: params.type,\n timestamp: params.timestamp * 1000,\n headers: params.request.headers,\n postData: params.request.postData,\n });\n \n networkRequests.set(tabId, requests);\n}\n\nfunction handleNetworkResponse(tabId: number, params: NetworkResponseParams): void {\n const requests = networkRequests.get(tabId) || [];\n const request = requests.find(r => r.requestId === params.requestId);\n \n if (request) {\n request.response = {\n status: params.response.status,\n statusText: params.response.statusText,\n headers: params.response.headers,\n mimeType: params.response.mimeType,\n };\n }\n}\n\nfunction handleNetworkFailed(tabId: number, params: NetworkFailedParams): void {\n const requests = networkRequests.get(tabId) || [];\n const request = requests.find(r => r.requestId === params.requestId);\n \n if (request) {\n request.failed = true;\n request.failureReason = params.errorText;\n }\n}\n\nasync function handleFetchPaused(tabId: number, params: FetchPausedParams): Promise<void> {\n const routes = networkRoutes.get(tabId) || [];\n const url = params.request.url;\n \n // 查找匹配的规则\n const matchedRoute = routes.find(route => {\n if (route.urlPattern === '*') return true;\n if (route.urlPattern.includes('*')) {\n const regex = new RegExp(route.urlPattern.replace(/\\*/g, '.*'));\n return regex.test(url);\n }\n return url.includes(route.urlPattern);\n });\n \n try {\n if (matchedRoute) {\n if (matchedRoute.action === 'abort') {\n await sendCommand(tabId, 'Fetch.failRequest', {\n requestId: params.requestId,\n errorReason: 'BlockedByClient',\n });\n console.log('[CDPService] Blocked request:', url);\n } else if (matchedRoute.action === 'fulfill') {\n await sendCommand(tabId, 'Fetch.fulfillRequest', {\n requestId: params.requestId,\n responseCode: matchedRoute.status || 200,\n responseHeaders: Object.entries(matchedRoute.headers || {}).map(([name, value]) => ({ name, value })),\n body: matchedRoute.body ? btoa(matchedRoute.body) : undefined,\n });\n console.log('[CDPService] Fulfilled request with mock:', url);\n } else {\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n }\n } else {\n // 没有匹配规则,继续请求\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n }\n } catch (error) {\n console.error('[CDPService] Fetch handling error:', error);\n // 出错时尝试继续请求\n try {\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n } catch {\n // 忽略\n }\n }\n}\n\n// ============================================================================\n// 事件处理函数 - Console/Runtime\n// ============================================================================\n\ninterface ConsoleAPIParams {\n type: string;\n args: Array<{ type: string; value?: unknown; description?: string }>;\n timestamp: number;\n stackTrace?: { callFrames: Array<{ url: string; lineNumber: number }> };\n}\n\ninterface LogEntryParams {\n entry: {\n level: string;\n text: string;\n timestamp: number;\n url?: string;\n lineNumber?: number;\n };\n}\n\ninterface ExceptionParams {\n exceptionDetails: {\n text: string;\n exception?: { description?: string };\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: { callFrames: Array<{ url: string; lineNumber: number; columnNumber: number }> };\n };\n timestamp: number;\n}\n\nfunction handleConsoleAPI(tabId: number, params: ConsoleAPIParams): void {\n const messages = consoleMessages.get(tabId) || [];\n \n if (messages.length >= MAX_CONSOLE_MESSAGES) {\n messages.shift();\n }\n \n // 将参数转换为文本\n const text = params.args\n .map(arg => arg.value !== undefined ? String(arg.value) : (arg.description || ''))\n .join(' ');\n \n const typeMap: Record<string, ConsoleMessage['type']> = {\n log: 'log',\n info: 'info',\n warning: 'warn',\n error: 'error',\n debug: 'debug',\n };\n \n messages.push({\n type: typeMap[params.type] || 'log',\n text,\n timestamp: params.timestamp,\n url: params.stackTrace?.callFrames[0]?.url,\n lineNumber: params.stackTrace?.callFrames[0]?.lineNumber,\n });\n \n consoleMessages.set(tabId, messages);\n}\n\nfunction handleLogEntry(tabId: number, params: LogEntryParams): void {\n const messages = consoleMessages.get(tabId) || [];\n \n if (messages.length >= MAX_CONSOLE_MESSAGES) {\n messages.shift();\n }\n \n const typeMap: Record<string, ConsoleMessage['type']> = {\n verbose: 'debug',\n info: 'info',\n warning: 'warn',\n error: 'error',\n };\n \n messages.push({\n type: typeMap[params.entry.level] || 'log',\n text: params.entry.text,\n timestamp: params.entry.timestamp,\n url: params.entry.url,\n lineNumber: params.entry.lineNumber,\n });\n \n consoleMessages.set(tabId, messages);\n}\n\nfunction handleException(tabId: number, params: ExceptionParams): void {\n const errors = jsErrors.get(tabId) || [];\n \n if (errors.length >= MAX_ERRORS) {\n errors.shift();\n }\n \n const details = params.exceptionDetails;\n const stackTrace = details.stackTrace?.callFrames\n .map(f => ` at ${f.url}:${f.lineNumber}:${f.columnNumber}`)\n .join('\\n');\n \n errors.push({\n message: details.exception?.description || details.text,\n url: details.url,\n lineNumber: details.lineNumber,\n columnNumber: details.columnNumber,\n stackTrace,\n timestamp: params.timestamp,\n });\n \n jsErrors.set(tabId, errors);\n}\n\n// ============================================================================\n// 辅助函数\n// ============================================================================\n\n/**\n * 计算元素中心点坐标\n */\nexport function getBoxCenter(box: DOMGetBoxModelResult['model']): { x: number; y: number } {\n // content 是 [x1,y1, x2,y2, x3,y3, x4,y4] 格式的四边形顶点\n const content = box.content;\n const x = (content[0] + content[2] + content[4] + content[6]) / 4;\n const y = (content[1] + content[3] + content[5] + content[7]) / 4;\n return { x, y };\n}\n\n/**\n * 检查 tab 是否已 attach\n */\nexport function isAttached(tabId: number): boolean {\n return attachedTabs.has(tabId);\n}\n","/**\n * DOM Service for bb-browser Extension\n * \n * 封装 buildDomTree 的注入和调用逻辑,将 DOM 树转换为可访问性树文本格式。\n * \n * v2.0: 本文件只保留 snapshot 相关逻辑,其他 DOM 操作已迁移到 cdp-dom-service.ts\n */\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** buildDomTree 返回的原始节点类型 */\ninterface RawDomTextNode {\n type: 'TEXT_NODE';\n text: string;\n isVisible: boolean;\n}\n\ninterface RawDomElementNode {\n tagName: string;\n xpath: string | null;\n attributes: Record<string, string>;\n children: string[];\n isVisible?: boolean;\n isInteractive?: boolean;\n isTopElement?: boolean;\n isInViewport?: boolean;\n highlightIndex?: number;\n shadowRoot?: boolean;\n}\n\ntype RawDomTreeNode = RawDomTextNode | RawDomElementNode;\n\ninterface BuildDomTreeResult {\n rootId: string;\n map: Record<string, RawDomTreeNode>;\n}\n\n/** Ref 元素信息 */\nexport interface RefInfo {\n xpath: string;\n role: string;\n name?: string;\n tagName: string;\n}\n\n/** Snapshot 结果 */\nexport interface SnapshotResult {\n snapshot: string;\n refs: Record<string, RefInfo>;\n}\n\n/** Snapshot 选项 */\nexport interface SnapshotOptions {\n /** 是否只输出可交互元素,默认 false(输出完整树) */\n interactive?: boolean;\n}\n\n/** buildDomTree 的参数 */\ninterface BuildDomTreeArgs {\n showHighlightElements: boolean;\n focusHighlightIndex: number;\n viewportExpansion: number;\n debugMode: boolean;\n startId: number;\n startHighlightIndex: number;\n}\n\ndeclare global {\n interface Window {\n buildDomTree: (args: BuildDomTreeArgs) => BuildDomTreeResult | null;\n }\n}\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 按 tabId 存储每个 tab 的 snapshot refs */\nconst tabSnapshotRefs = new Map<number, Record<string, RefInfo>>();\n\n/** 按 tabId 存储每个 tab 的活动 Frame ID */\nconst tabActiveFrameId = new Map<number, number | null>();\n\n// ============================================================================\n// 公共 API\n// ============================================================================\n\n/**\n * 设置指定 tab 的活动 frame\n */\nexport function setActiveFrameId(tabId: number, frameId: number | null): void {\n tabActiveFrameId.set(tabId, frameId);\n console.log('[DOMService] Active frame changed:', { tabId, frameId: frameId ?? 0 });\n}\n\n/**\n * 获取 ref 对应的信息(在指定 tab 的 refs 中查找)\n */\nexport function getRefInfo(tabId: number, ref: string): RefInfo | null {\n const refId = ref.startsWith('@') ? ref.slice(1) : ref;\n const refs = tabSnapshotRefs.get(tabId) || {};\n return refs[refId] || null;\n}\n\n/**\n * 清理指定 tab 的状态(tab 关闭时调用)\n */\nexport function cleanupTab(tabId: number): void {\n tabSnapshotRefs.delete(tabId);\n tabActiveFrameId.delete(tabId);\n}\n\n/**\n * 获取页面快照\n * @param tabId 目标标签页 ID\n * @param options 快照选项\n * @returns 可访问性树文本和元素引用映射\n */\nexport async function getSnapshot(tabId: number, options: SnapshotOptions = {}): Promise<SnapshotResult> {\n const { interactive = false } = options;\n \n console.log('[DOMService] Getting snapshot for tab:', tabId, { interactive });\n \n // 1. 注入脚本\n await injectBuildDomTreeScript(tabId);\n \n // 2. 执行 buildDomTree\n const domTreeResult = await executeBuildDomTree(tabId);\n \n // 3. 根据模式选择转换方式\n const snapshotResult = interactive \n ? convertToAccessibilityTree(domTreeResult)\n : convertToFullTree(domTreeResult);\n \n // 4. 存储 refs 供后续操作使用(按 tabId 隔离)\n tabSnapshotRefs.set(tabId, snapshotResult.refs);\n \n console.log('[DOMService] Snapshot complete:', {\n mode: interactive ? 'interactive' : 'full',\n linesCount: snapshotResult.snapshot.split('\\n').length,\n refsCount: Object.keys(snapshotResult.refs).length,\n });\n \n return snapshotResult;\n}\n\n// ============================================================================\n// 内部函数 - 脚本注入\n// ============================================================================\n\n/**\n * 获取当前活动 frame 的 target\n */\nfunction getFrameTarget(tabId: number): { tabId: number; frameIds?: number[] } {\n const frameId = tabActiveFrameId.get(tabId) ?? null;\n if (frameId !== null) {\n return { tabId, frameIds: [frameId] };\n }\n return { tabId };\n}\n\n/**\n * 注入 buildDomTree 脚本到目标标签页\n */\nasync function injectBuildDomTreeScript(tabId: number): Promise<void> {\n try {\n const target = getFrameTarget(tabId);\n \n // 检查脚本是否已注入\n const checkResults = await chrome.scripting.executeScript({\n target,\n func: () => Object.prototype.hasOwnProperty.call(window, 'buildDomTree'),\n });\n \n const isInjected = checkResults[0]?.result;\n if (isInjected) {\n return;\n }\n \n // 注入脚本\n await chrome.scripting.executeScript({\n target,\n files: ['buildDomTree.js'],\n });\n } catch (error) {\n console.error('[DOMService] Failed to inject buildDomTree script:', error);\n throw new Error(`Failed to inject script: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 执行 buildDomTree 并获取 DOM 快照\n */\nasync function executeBuildDomTree(tabId: number): Promise<BuildDomTreeResult> {\n const target = getFrameTarget(tabId);\n \n const results = await chrome.scripting.executeScript({\n target,\n func: (args: BuildDomTreeArgs) => {\n return (window as unknown as { buildDomTree: (args: BuildDomTreeArgs) => BuildDomTreeResult | null }).buildDomTree(args);\n },\n args: [{\n showHighlightElements: true,\n focusHighlightIndex: -1,\n viewportExpansion: -1, // -1 = 全页面模式,不限制视口\n debugMode: false,\n startId: 0,\n startHighlightIndex: 0,\n }],\n });\n \n const result = results[0]?.result as BuildDomTreeResult | null;\n if (!result || !result.map || !result.rootId) {\n throw new Error('Failed to build DOM tree: invalid result structure');\n }\n \n return result;\n}\n\n// ============================================================================\n// 内部函数 - 角色和名称计算\n// ============================================================================\n\n/**\n * 将 tagName 转换为可访问性角色\n */\nfunction getRole(node: RawDomElementNode): string {\n const tagName = node.tagName.toLowerCase();\n const role = node.attributes?.role;\n \n if (role) return role;\n \n const roleMap: Record<string, string> = {\n a: 'link',\n button: 'button',\n input: getInputRole(node),\n select: 'combobox',\n textarea: 'textbox',\n img: 'image',\n nav: 'navigation',\n main: 'main',\n header: 'banner',\n footer: 'contentinfo',\n aside: 'complementary',\n form: 'form',\n table: 'table',\n ul: 'list',\n ol: 'list',\n li: 'listitem',\n h1: 'heading',\n h2: 'heading',\n h3: 'heading',\n h4: 'heading',\n h5: 'heading',\n h6: 'heading',\n dialog: 'dialog',\n article: 'article',\n section: 'region',\n label: 'label',\n details: 'group',\n summary: 'button',\n };\n \n return roleMap[tagName] || tagName;\n}\n\n/**\n * 根据 input type 获取角色\n */\nfunction getInputRole(node: RawDomElementNode): string {\n const type = node.attributes?.type?.toLowerCase() || 'text';\n \n const inputRoleMap: Record<string, string> = {\n text: 'textbox',\n password: 'textbox',\n email: 'textbox',\n url: 'textbox',\n tel: 'textbox',\n search: 'searchbox',\n number: 'spinbutton',\n range: 'slider',\n checkbox: 'checkbox',\n radio: 'radio',\n button: 'button',\n submit: 'button',\n reset: 'button',\n file: 'button',\n };\n \n return inputRoleMap[type] || 'textbox';\n}\n\n/**\n * 获取元素的可访问名称\n */\nfunction getAccessibleName(node: RawDomElementNode, nodeMap: Record<string, RawDomTreeNode>): string | undefined {\n const attrs = node.attributes || {};\n \n if (attrs['aria-label']) return attrs['aria-label'];\n if (attrs.title) return attrs.title;\n if (attrs.placeholder) return attrs.placeholder;\n if (attrs.alt) return attrs.alt;\n if (attrs.value) return attrs.value;\n \n const textContent = collectTextContent(node, nodeMap);\n if (textContent) return textContent;\n \n if (attrs.name) return attrs.name;\n \n return undefined;\n}\n\n/**\n * 收集节点的文本内容\n */\nfunction collectTextContent(\n node: RawDomElementNode, \n nodeMap: Record<string, RawDomTreeNode>, \n maxDepth = 5\n): string {\n const texts: string[] = [];\n \n function collect(nodeId: string, depth: number): void {\n if (depth > maxDepth) return;\n \n const currentNode = nodeMap[nodeId];\n if (!currentNode) return;\n \n if ('type' in currentNode && currentNode.type === 'TEXT_NODE') {\n const text = currentNode.text.trim();\n if (text) texts.push(text);\n return;\n }\n \n const elementNode = currentNode as RawDomElementNode;\n for (const childId of elementNode.children || []) {\n collect(childId, depth + 1);\n }\n }\n \n for (const childId of node.children || []) {\n collect(childId, 0);\n }\n \n return texts.join(' ').trim();\n}\n\n/**\n * 截断文本\n */\nfunction truncateText(text: string, maxLength = 50): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n}\n\n/**\n * 检查节点 A 是否是节点 B 的祖先\n */\nfunction isAncestor(ancestorId: string, descendantId: string, nodeMap: Record<string, RawDomTreeNode>): boolean {\n const descendant = nodeMap[descendantId];\n if (!descendant || 'type' in descendant) return false;\n \n const ancestor = nodeMap[ancestorId];\n if (!ancestor || 'type' in ancestor) return false;\n \n const ancestorElement = ancestor as RawDomElementNode;\n const elementNode = descendant as RawDomElementNode;\n if (!ancestorElement.xpath || !elementNode.xpath) return false;\n \n return elementNode.xpath.startsWith(ancestorElement.xpath + '/');\n}\n\n// ============================================================================\n// 内部函数 - 树转换\n// ============================================================================\n\n/**\n * 将 DOM 树转换为可访问性树文本格式(只含可交互元素)\n */\nfunction convertToAccessibilityTree(result: BuildDomTreeResult): SnapshotResult {\n const lines: string[] = [];\n const refs: Record<string, RefInfo> = {};\n const { map } = result;\n \n // 收集所有有 highlightIndex 的节点\n const interactiveNodes: Array<{ id: string; node: RawDomElementNode }> = [];\n \n for (const [id, node] of Object.entries(map)) {\n if (!node) continue;\n if ('type' in node && node.type === 'TEXT_NODE') continue;\n \n const elementNode = node as RawDomElementNode;\n if (elementNode.highlightIndex !== undefined && elementNode.highlightIndex !== null) {\n interactiveNodes.push({ id, node: elementNode });\n }\n }\n \n // 按 highlightIndex 排序\n interactiveNodes.sort((a, b) => (a.node.highlightIndex ?? 0) - (b.node.highlightIndex ?? 0));\n \n // 收集所有节点的 name 和 role\n const nodeIdToInfo = new Map<string, { name: string | undefined; role: string }>();\n for (const { id, node } of interactiveNodes) {\n nodeIdToInfo.set(id, { \n name: getAccessibleName(node, map), \n role: getRole(node) \n });\n }\n \n // 过滤冗余节点\n const nonSemanticTags = new Set(['span', 'div', 'i', 'b', 'em', 'strong', 'small', 'svg', 'path', 'g']);\n const filterableTags = new Set(['label']);\n const filteredNodes: Array<{ id: string; node: RawDomElementNode }> = [];\n \n for (const item of interactiveNodes) {\n const { id, node } = item;\n const info = nodeIdToInfo.get(id)!;\n const tagName = node.tagName.toLowerCase();\n \n // 规则1: 过滤没有名称的非语义化元素\n if ((nonSemanticTags.has(tagName) || tagName === 'a') && !info.name) continue;\n \n // 规则2: 过滤 label 元素\n if (filterableTags.has(tagName)) continue;\n \n // 规则3: 过滤可交互元素的非语义化子元素\n let isChildOfInteractive = false;\n for (const otherItem of interactiveNodes) {\n if (otherItem.id === id) continue;\n const otherTagName = otherItem.node.tagName.toLowerCase();\n if (['a', 'button'].includes(otherTagName) && \n nonSemanticTags.has(tagName) && \n isAncestor(otherItem.id, id, map)) {\n isChildOfInteractive = true;\n break;\n }\n }\n if (isChildOfInteractive) continue;\n \n // 规则4: 过滤与祖先同名的节点\n let isDuplicate = false;\n for (const otherItem of interactiveNodes) {\n if (otherItem.id === id) continue;\n const otherInfo = nodeIdToInfo.get(otherItem.id)!;\n if (isAncestor(otherItem.id, id, map) && \n info.name && otherInfo.name && \n info.name === otherInfo.name) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) filteredNodes.push(item);\n }\n \n // 生成输出\n for (const { id, node } of filteredNodes) {\n const refId = String(node.highlightIndex);\n const info = nodeIdToInfo.get(id)!;\n \n let line = `- ${info.role}`;\n if (info.name) line += ` \"${truncateText(info.name)}\"`;\n line += ` [ref=${refId}]`;\n \n lines.push(line);\n refs[refId] = {\n xpath: node.xpath || '',\n role: info.role,\n name: info.name ? truncateText(info.name, 100) : undefined,\n tagName: node.tagName,\n };\n }\n \n return { snapshot: lines.join('\\n'), refs };\n}\n\n/**\n * 将 DOM 树转换为完整树文本格式(包含所有元素和文本节点)\n */\nfunction convertToFullTree(result: BuildDomTreeResult): SnapshotResult {\n const lines: string[] = [];\n const refs: Record<string, RefInfo> = {};\n const { rootId, map } = result;\n \n const skipTags = new Set([\n 'script', 'style', 'noscript', 'svg', 'path', 'g', 'defs', \n 'clippath', 'lineargradient', 'stop', 'symbol', 'use', 'meta', 'link', 'head'\n ]);\n \n function traverse(nodeId: string, depth: number): void {\n const node = map[nodeId];\n if (!node) return;\n \n const indent = ' '.repeat(depth);\n \n // 文本节点\n if ('type' in node && node.type === 'TEXT_NODE') {\n if (!node.isVisible) return;\n const text = node.text.trim();\n if (!text) return;\n const displayText = text.length > 100 ? text.slice(0, 97) + '...' : text;\n lines.push(`${indent}- text: ${displayText}`);\n return;\n }\n \n // 元素节点\n const elementNode = node as RawDomElementNode;\n const tagName = elementNode.tagName.toLowerCase();\n \n if (elementNode.isVisible === false) return;\n if (skipTags.has(tagName)) return;\n \n const role = getRole(elementNode);\n const name = getAccessibleName(elementNode, map);\n const hasRef = elementNode.highlightIndex !== undefined && elementNode.highlightIndex !== null;\n \n let line = `${indent}- ${role}`;\n if (name) {\n const displayName = name.length > 50 ? name.slice(0, 47) + '...' : name;\n line += ` \"${displayName}\"`;\n }\n if (hasRef) {\n const refId = String(elementNode.highlightIndex);\n line += ` [ref=${refId}]`;\n refs[refId] = {\n xpath: elementNode.xpath || '',\n role,\n name: name ? (name.length > 100 ? name.slice(0, 97) + '...' : name) : undefined,\n tagName: elementNode.tagName,\n };\n }\n \n lines.push(line);\n \n for (const childId of elementNode.children || []) {\n traverse(childId, depth + 1);\n }\n }\n \n const rootNode = map[rootId];\n if (rootNode && !('type' in rootNode)) {\n for (const childId of (rootNode as RawDomElementNode).children || []) {\n traverse(childId, 0);\n }\n }\n \n return { snapshot: lines.join('\\n'), refs };\n}\n","/**\n * CDP DOM Service for bb-browser Extension\n * \n * 使用 CDP 协议实现 DOM 操作,替代 Content Script 注入方式。\n * \n * 主要功能:\n * - snapshot: 使用 Runtime.evaluate + buildDomTree(通过 CDP 注入)\n * - click/hover: 使用 DOM.getBoxModel + Input.dispatchMouseEvent\n * - fill/type: 使用 Input.insertText\n * - get text: 使用 Runtime.callFunctionOn\n */\n\nimport * as cdp from './cdp-service';\n// 暂时复用原有的 snapshot 实现(使用 chrome.scripting.executeScript)\nimport { getSnapshot as legacyGetSnapshot, getRefInfo as legacyGetRefInfo, type RefInfo as LegacyRefInfo, type SnapshotResult as LegacySnapshotResult } from './dom-service';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** Ref 元素信息 - 使用 xpath 定位(兼容旧实现) */\nexport interface RefInfo {\n xpath: string;\n role: string;\n name?: string;\n tagName?: string;\n}\n\n/** Snapshot 结果 */\nexport interface SnapshotResult {\n snapshot: string;\n refs: Record<string, RefInfo>;\n}\n\n/** Snapshot 选项 */\nexport interface SnapshotOptions {\n /** 是否只输出可交互元素,默认 false */\n interactive?: boolean;\n}\n\n// ============================================================================\n// 状态管理(使用 chrome.storage.session 持久化,防止 Service Worker 休眠丢失)\n// ============================================================================\n\n/** 按 tabId 存储每个 tab 的 snapshot refs(内存缓存) */\nconst tabSnapshotRefs = new Map<number, Record<string, RefInfo>>();\n\n/** 按 tabId 存储每个 tab 的活动 Frame ID */\nconst tabActiveFrameId = new Map<number, string | null>();\n\n/** 从 storage 恢复所有 tab 的 refs(Service Worker 唤醒时调用) */\nasync function loadRefsFromStorage(): Promise<void> {\n try {\n const result = await chrome.storage.session.get('tabSnapshotRefs');\n if (result.tabSnapshotRefs) {\n const stored = result.tabSnapshotRefs as Record<string, Record<string, RefInfo>>;\n for (const [tabIdStr, refs] of Object.entries(stored)) {\n tabSnapshotRefs.set(Number(tabIdStr), refs);\n }\n console.log('[CDPDOMService] Loaded refs from storage:', tabSnapshotRefs.size, 'tabs');\n }\n } catch (e) {\n console.warn('[CDPDOMService] Failed to load refs from storage:', e);\n }\n}\n\n/** 保存指定 tab 的 refs 到 storage */\nasync function saveRefsToStorage(tabId: number, refs: Record<string, RefInfo>): Promise<void> {\n try {\n // 读取现有的,更新指定 tab,写回\n const result = await chrome.storage.session.get('tabSnapshotRefs');\n const stored = (result.tabSnapshotRefs || {}) as Record<string, Record<string, RefInfo>>;\n stored[String(tabId)] = refs;\n await chrome.storage.session.set({ tabSnapshotRefs: stored });\n console.log('[CDPDOMService] Saved refs to storage for tab:', tabId, Object.keys(refs).length);\n } catch (e) {\n console.warn('[CDPDOMService] Failed to save refs to storage:', e);\n }\n}\n\n// Service Worker 启动时恢复 refs\nloadRefsFromStorage();\n\n// ============================================================================\n// Snapshot 实现\n// ============================================================================\n\n/**\n * 获取页面快照\n * 暂时使用旧的实现(chrome.scripting.executeScript + buildDomTree)\n * TODO: 后续迁移到纯 CDP 实现(Accessibility.getFullAXTree 或 Runtime.evaluate)\n */\nexport async function getSnapshot(\n tabId: number,\n options: SnapshotOptions = {}\n): Promise<SnapshotResult> {\n console.log('[CDPDOMService] Getting snapshot via legacy method for tab:', tabId);\n \n // 使用旧的实现\n const result = await legacyGetSnapshot(tabId, options);\n \n // 转换 refs 格式(添加 xpath 兼容)\n const convertedRefs: Record<string, RefInfo> = {};\n for (const [refId, refInfo] of Object.entries(result.refs)) {\n convertedRefs[refId] = {\n xpath: refInfo.xpath,\n role: refInfo.role,\n name: refInfo.name,\n tagName: refInfo.tagName,\n };\n }\n \n // 保存 refs 供后续操作使用(按 tabId 隔离,内存 + storage)\n tabSnapshotRefs.set(tabId, convertedRefs);\n await saveRefsToStorage(tabId, convertedRefs);\n \n console.log('[CDPDOMService] Snapshot complete:', {\n linesCount: result.snapshot.split('\\n').length,\n refsCount: Object.keys(convertedRefs).length,\n });\n \n return {\n snapshot: result.snapshot,\n refs: convertedRefs,\n };\n}\n\n// ============================================================================\n// DOM 操作\n// ============================================================================\n\n/**\n * 获取 ref 对应的信息(在指定 tab 的 refs 中查找)\n * 优先从内存缓存读取,如果没有则尝试从 storage 恢复\n */\nexport async function getRefInfo(tabId: number, ref: string): Promise<RefInfo | null> {\n const refId = ref.startsWith('@') ? ref.slice(1) : ref;\n \n // 先检查内存缓存\n const refs = tabSnapshotRefs.get(tabId);\n if (refs?.[refId]) {\n return refs[refId];\n }\n \n // 内存中没有,尝试从 storage 恢复\n if (!tabSnapshotRefs.has(tabId)) {\n await loadRefsFromStorage();\n const loaded = tabSnapshotRefs.get(tabId);\n if (loaded?.[refId]) {\n return loaded[refId];\n }\n }\n \n return null;\n}\n\n/**\n * 清理指定 tab 的状态(tab 关闭时调用)\n */\nexport function cleanupTab(tabId: number): void {\n tabSnapshotRefs.delete(tabId);\n tabActiveFrameId.delete(tabId);\n}\n\n/**\n * 通过 xpath 获取元素的 nodeId 和 backendNodeId\n */\nasync function getNodeByXPath(\n tabId: number,\n xpath: string\n): Promise<{ nodeId: number; backendNodeId: number }> {\n // 先获取文档根节点\n const doc = await cdp.getDocument(tabId, { depth: 0 });\n \n // 使用 DOM.performSearch 或 Runtime.evaluate 来查找 xpath\n // CDP 没有直接的 xpath 查询,我们用 Runtime.evaluate\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return null;\n \n // 返回元素的一些信息供调试\n const rect = element.getBoundingClientRect();\n return {\n found: true,\n tagName: element.tagName,\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n width: rect.width,\n height: rect.height,\n };\n })()\n `, { returnByValue: true });\n \n if (!result || !(result as { found?: boolean }).found) {\n throw new Error(`Element not found by xpath: ${xpath}`);\n }\n \n return result as { nodeId: number; backendNodeId: number; x: number; y: number };\n}\n\n/**\n * 通过 xpath 获取元素的中心坐标\n */\nasync function getElementCenterByXPath(\n tabId: number,\n xpath: string\n): Promise<{ x: number; y: number }> {\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return null;\n \n // 滚动到可见\n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n \n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n })()\n `, { returnByValue: true });\n \n if (!result) {\n throw new Error(`Element not found by xpath: ${xpath}`);\n }\n \n return result as { x: number; y: number };\n}\n\n/**\n * 点击元素\n * 使用 CDP Runtime.evaluate 定位 + Input.dispatchMouseEvent 点击\n */\nexport async function clickElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 获取元素中心坐标(同时滚动到可见)\n const { x, y } = await getElementCenterByXPath(tabId, xpath);\n\n // 使用 CDP 点击\n await cdp.click(tabId, x, y);\n\n console.log('[CDPDOMService] Clicked element:', { ref, role, name, x, y });\n return { role, name };\n}\n\n/**\n * 悬停在元素上\n * 使用 CDP Runtime.evaluate 定位 + Input.dispatchMouseEvent 悬停\n */\nexport async function hoverElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 获取元素中心坐标(同时滚动到可见)\n const { x, y } = await getElementCenterByXPath(tabId, xpath);\n\n // 使用 CDP 移动鼠标\n await cdp.moveMouse(tabId, x, y);\n\n console.log('[CDPDOMService] Hovered element:', { ref, role, name, x, y });\n return { role, name };\n}\n\n/**\n * 填充输入框(清空后输入)\n * 使用 CDP Runtime.evaluate 聚焦 + Input.insertText 输入\n */\nexport async function fillElement(\n tabId: number,\n ref: string,\n text: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 滚动到可见并聚焦\n await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n \n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n element.focus();\n \n // 清空内容\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {\n element.value = '';\n } else if (element.isContentEditable) {\n element.textContent = '';\n }\n })()\n `);\n\n // 输入文本\n await cdp.insertText(tabId, text);\n\n console.log('[CDPDOMService] Filled element:', { ref, role, name, textLength: text.length });\n return { role, name };\n}\n\n/**\n * 逐字符输入文本(不清空)\n * 使用 CDP Runtime.evaluate 聚焦 + Input.dispatchKeyEvent 输入\n */\nexport async function typeElement(\n tabId: number,\n ref: string,\n text: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 滚动到可见并聚焦\n await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n \n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n element.focus();\n })()\n `);\n\n // 逐字符输入\n for (const char of text) {\n await cdp.pressKey(tabId, char);\n }\n\n console.log('[CDPDOMService] Typed in element:', { ref, role, name, textLength: text.length });\n return { role, name };\n}\n\n/**\n * 获取元素文本内容\n * 使用 CDP Runtime.evaluate\n */\nexport async function getElementText(tabId: number, ref: string): Promise<string> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath } = refInfo;\n\n const text = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return '';\n return (element.textContent || '').trim();\n })()\n `);\n\n console.log('[CDPDOMService] Got element text:', { ref, textLength: (text as string).length });\n return text as string;\n}\n\n/**\n * 勾选复选框\n * 使用 CDP Runtime.evaluate\n */\nexport async function checkElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string; wasAlreadyChecked: boolean }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.type !== 'checkbox' && element.type !== 'radio') {\n throw new Error('Element is not a checkbox or radio');\n }\n const wasChecked = element.checked;\n if (!wasChecked) {\n element.checked = true;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n return wasChecked;\n })()\n `);\n\n console.log('[CDPDOMService] Checked element:', { ref, role, name, wasAlreadyChecked: result });\n return { role, name, wasAlreadyChecked: result as boolean };\n}\n\n/**\n * 取消勾选复选框\n * 使用 CDP Runtime.evaluate\n */\nexport async function uncheckElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string; wasAlreadyUnchecked: boolean }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.type !== 'checkbox' && element.type !== 'radio') {\n throw new Error('Element is not a checkbox or radio');\n }\n const wasUnchecked = !element.checked;\n if (!wasUnchecked) {\n element.checked = false;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n return wasUnchecked;\n })()\n `);\n\n console.log('[CDPDOMService] Unchecked element:', { ref, role, name, wasAlreadyUnchecked: result });\n return { role, name, wasAlreadyUnchecked: result as boolean };\n}\n\n/**\n * 选择下拉框选项\n * 使用 CDP Runtime.evaluate\n */\nexport async function selectOption(\n tabId: number,\n ref: string,\n value: string\n): Promise<{ role: string; name?: string; selectedValue: string; selectedLabel: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const selectValue = ${JSON.stringify(value)};\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.tagName !== 'SELECT') {\n throw new Error('Element is not a <select> element');\n }\n \n // 尝试通过 value 或 text 匹配\n let matched = null;\n for (const opt of element.options) {\n if (opt.value === selectValue || opt.textContent.trim() === selectValue) {\n matched = opt;\n break;\n }\n }\n \n // 不区分大小写匹配\n if (!matched) {\n const lower = selectValue.toLowerCase();\n for (const opt of element.options) {\n if (opt.value.toLowerCase() === lower || opt.textContent.trim().toLowerCase() === lower) {\n matched = opt;\n break;\n }\n }\n }\n \n if (!matched) {\n const available = Array.from(element.options).map(o => ({ value: o.value, label: o.textContent.trim() }));\n throw new Error('Option not found: ' + selectValue + '. Available: ' + JSON.stringify(available));\n }\n \n element.value = matched.value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n \n return { selectedValue: matched.value, selectedLabel: matched.textContent.trim() };\n })()\n `);\n\n const { selectedValue, selectedLabel } = result as { selectedValue: string; selectedLabel: string };\n console.log('[CDPDOMService] Selected option:', { ref, role, name, selectedValue });\n return { role, name, selectedValue, selectedLabel };\n}\n\n/**\n * 等待元素出现\n * 使用 CDP Runtime.evaluate 检查元素是否存在\n */\nexport async function waitForElement(\n tabId: number,\n ref: string,\n maxWait = 10000,\n interval = 200\n): Promise<void> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath } = refInfo;\n let elapsed = 0;\n\n while (elapsed < maxWait) {\n const found = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue !== null;\n })()\n `);\n\n if (found) {\n console.log('[CDPDOMService] Element found:', { ref, elapsed });\n return;\n }\n\n await new Promise(resolve => setTimeout(resolve, interval));\n elapsed += interval;\n }\n\n throw new Error(`Timeout waiting for element @${ref} after ${maxWait}ms`);\n}\n\n// ============================================================================\n// Frame 管理\n// ============================================================================\n\n/**\n * 设置指定 tab 的活动 frame\n */\nexport function setActiveFrameId(tabId: number, frameId: string | null): void {\n tabActiveFrameId.set(tabId, frameId);\n console.log('[CDPDOMService] Active frame changed:', { tabId, frameId: frameId ?? 'main' });\n}\n\n/**\n * 获取指定 tab 的活动 frame\n */\nexport function getActiveFrameId(tabId: number): string | null {\n return tabActiveFrameId.get(tabId) ?? null;\n}\n\n// ============================================================================\n// 输入操作\n// ============================================================================\n\n/**\n * 发送键盘按键\n */\nexport async function pressKey(\n tabId: number,\n key: string,\n modifiers: string[] = []\n): Promise<void> {\n // 计算 modifiers 位掩码\n let modifierFlags = 0;\n if (modifiers.includes('Alt')) modifierFlags |= 1;\n if (modifiers.includes('Control')) modifierFlags |= 2;\n if (modifiers.includes('Meta')) modifierFlags |= 4;\n if (modifiers.includes('Shift')) modifierFlags |= 8;\n\n await cdp.pressKey(tabId, key, { modifiers: modifierFlags });\n console.log('[CDPDOMService] Pressed key:', key, modifiers);\n}\n\n/**\n * 滚动页面\n */\nexport async function scrollPage(\n tabId: number,\n direction: 'up' | 'down' | 'left' | 'right',\n pixels: number\n): Promise<void> {\n // 获取页面尺寸以确定滚动位置\n const result = await cdp.evaluate(\n tabId,\n 'JSON.stringify({ width: window.innerWidth, height: window.innerHeight })'\n );\n const { width, height } = JSON.parse(result as string);\n \n // 在页面中心位置滚动\n const x = width / 2;\n const y = height / 2;\n \n let deltaX = 0;\n let deltaY = 0;\n \n switch (direction) {\n case 'up': deltaY = -pixels; break;\n case 'down': deltaY = pixels; break;\n case 'left': deltaX = -pixels; break;\n case 'right': deltaX = pixels; break;\n }\n\n await cdp.scroll(tabId, x, y, deltaX, deltaY);\n console.log('[CDPDOMService] Scrolled:', { direction, pixels });\n}\n","/**\n * Trace Service\n * \n * Background 中的 trace 状态管理\n * 负责:\n * - 管理录制状态\n * - 存储录制的事件\n * - 与 content script 通信\n */\n\nimport type { TraceEvent, TraceStatus } from '@anthropic/bb-browser-shared';\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 是否正在录制 */\nlet isRecording = false;\n\n/** 录制的标签页 ID */\nlet recordingTabId: number | null = null;\n\n/** 录制的事件列表 */\nlet events: TraceEvent[] = [];\n\n// ============================================================================\n// 公共 API\n// ============================================================================\n\n/**\n * 开始录制\n */\nexport async function startRecording(tabId: number): Promise<void> {\n console.log('[TraceService] Starting recording on tab:', tabId);\n \n isRecording = true;\n recordingTabId = tabId;\n events = [];\n \n // 添加页面导航事件作为第一个事件\n try {\n const tab = await chrome.tabs.get(tabId);\n if (tab.url) {\n events.push({\n type: 'navigation',\n timestamp: Date.now(),\n url: tab.url,\n elementRole: 'document',\n elementName: tab.title || '',\n elementTag: 'document',\n });\n }\n } catch (error) {\n console.error('[TraceService] Error getting tab info:', error);\n }\n \n // 通知 content script 开始录制\n try {\n await chrome.tabs.sendMessage(tabId, { type: 'TRACE_START' });\n } catch (error) {\n // Content script 可能尚未加载,注入它\n console.log('[TraceService] Content script not ready, will record on next event');\n }\n}\n\n/**\n * 停止录制\n */\nexport async function stopRecording(): Promise<TraceEvent[]> {\n console.log('[TraceService] Stopping recording, events:', events.length);\n \n const recordedEvents = [...events];\n \n // 通知 content script 停止录制\n if (recordingTabId !== null) {\n try {\n await chrome.tabs.sendMessage(recordingTabId, { type: 'TRACE_STOP' });\n } catch (error) {\n // Content script 可能已关闭\n console.log('[TraceService] Could not notify content script:', error);\n }\n }\n \n isRecording = false;\n recordingTabId = null;\n events = [];\n \n return recordedEvents;\n}\n\n/**\n * 获取录制状态\n */\nexport function getStatus(): TraceStatus {\n return {\n recording: isRecording,\n eventCount: events.length,\n tabId: recordingTabId ?? undefined,\n };\n}\n\n/**\n * 添加事件\n */\nexport function addEvent(event: TraceEvent): void {\n if (!isRecording) return;\n \n console.log('[TraceService] Adding event:', event.type, event);\n events.push(event);\n}\n\n/**\n * 检查是否正在录制\n */\nexport function isCurrentlyRecording(): boolean {\n return isRecording;\n}\n\n/**\n * 获取录制的标签页 ID\n */\nexport function getRecordingTabId(): number | null {\n return recordingTabId;\n}\n\n// ============================================================================\n// 消息监听\n// ============================================================================\n\n// 监听来自 content script 的消息\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n // 处理 trace 事件\n if (message.type === 'TRACE_EVENT') {\n if (isRecording && sender.tab?.id === recordingTabId) {\n addEvent(message.payload as TraceEvent);\n }\n sendResponse({ received: true });\n return true;\n }\n \n // 处理 content script 请求录制状态\n if (message.type === 'GET_TRACE_STATUS') {\n sendResponse({\n recording: isRecording && sender.tab?.id === recordingTabId,\n tabId: recordingTabId,\n });\n return true;\n }\n \n return false;\n});\n\n// 监听标签页关闭事件\nchrome.tabs.onRemoved.addListener((tabId) => {\n if (tabId === recordingTabId) {\n console.log('[TraceService] Recording tab closed, stopping recording');\n isRecording = false;\n recordingTabId = null;\n // 不清空 events,以便用户可以恢复\n }\n});\n\n// 监听标签页导航事件\nchrome.tabs.onUpdated.addListener(async (tabId, changeInfo, _tab) => {\n if (tabId === recordingTabId && isRecording) {\n // 记录导航事件\n if (changeInfo.url) {\n events.push({\n type: 'navigation',\n timestamp: Date.now(),\n url: changeInfo.url,\n elementRole: 'document',\n elementName: _tab.title || '',\n elementTag: 'document',\n });\n console.log('[TraceService] Navigation event:', changeInfo.url);\n }\n \n // 页面加载完成后,通知 content script 开始录制\n if (changeInfo.status === 'complete') {\n console.log('[TraceService] Page loaded, notifying content script to start recording');\n try {\n await chrome.tabs.sendMessage(tabId, { type: 'TRACE_START' });\n } catch (error) {\n console.log('[TraceService] Could not notify content script:', error);\n }\n }\n }\n});\n\nconsole.log('[TraceService] Initialized');\n","/**\n * Command Handler for bb-browser Extension\n * 处理从 Daemon 接收的命令\n * \n * v2.0: 使用 CDP (chrome.debugger) 实现所有 DOM 操作\n */\n\nimport { sendResult, CommandResult } from './api-client';\nimport { CommandEvent } from './sse-client';\nimport * as cdp from './cdp-service';\nimport * as cdpDom from './cdp-dom-service';\nimport { cleanupTab as cleanupCdpTab } from './cdp-dom-service';\nimport { cleanupTab as cleanupDomTab } from './dom-service';\nimport * as traceService from './trace-service';\n\n// 初始化 CDP 事件监听器\ncdp.initEventListeners();\n\n/**\n * 每个 tab 的活动 Frame 的 frameId\n * null 表示主 frame,数字表示子 frame 的 frameId\n * 用于 handleFrame 内部逻辑,DOM 操作使用 dom-service 的 activeFrameId\n */\nconst tabActiveFrameId = new Map<number, number | null>();\n\n/**\n * 根据命令解析目标 tab\n * 如果 command.tabId 是 number,用它直接获取 tab\n * 否则 fallback 到当前活跃 tab\n */\nasync function resolveTab(command: CommandEvent): Promise<chrome.tabs.Tab> {\n if (command.tabId !== undefined && typeof command.tabId === 'number') {\n return chrome.tabs.get(command.tabId);\n }\n const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });\n if (!tab?.id) {\n throw new Error('No active tab found');\n }\n return tab;\n}\n\n/**\n * 处理收到的命令\n */\nexport async function handleCommand(command: CommandEvent): Promise<void> {\n console.log('[CommandHandler] Processing command:', command.id, command.action);\n\n let result: CommandResult;\n\n try {\n switch (command.action) {\n case 'open':\n result = await handleOpen(command);\n break;\n\n case 'snapshot':\n result = await handleSnapshot(command);\n break;\n\n case 'click':\n result = await handleClick(command);\n break;\n\n case 'hover':\n result = await handleHover(command);\n break;\n\n case 'fill':\n result = await handleFill(command);\n break;\n\n case 'type':\n result = await handleType(command);\n break;\n\n case 'check':\n result = await handleCheck(command);\n break;\n\n case 'uncheck':\n result = await handleUncheck(command);\n break;\n\n case 'close':\n result = await handleClose(command);\n break;\n\n case 'get':\n result = await handleGet(command);\n break;\n\n case 'screenshot':\n result = await handleScreenshot(command);\n break;\n\n case 'wait':\n result = await handleWait(command);\n break;\n\n case 'press':\n result = await handlePress(command);\n break;\n\n case 'scroll':\n result = await handleScroll(command);\n break;\n\n case 'back':\n result = await handleBack(command);\n break;\n\n case 'forward':\n result = await handleForward(command);\n break;\n\n case 'refresh':\n result = await handleRefresh(command);\n break;\n\n case 'eval':\n result = await handleEval(command);\n break;\n\n case 'select':\n result = await handleSelect(command);\n break;\n\n case 'tab_list':\n result = await handleTabList(command);\n break;\n\n case 'tab_new':\n result = await handleTabNew(command);\n break;\n\n case 'tab_select':\n result = await handleTabSelect(command);\n break;\n\n case 'tab_close':\n result = await handleTabClose(command);\n break;\n\n case 'frame':\n result = await handleFrame(command);\n break;\n\n case 'frame_main':\n result = await handleFrameMain(command);\n break;\n\n case 'dialog':\n result = await handleDialog(command);\n break;\n\n case 'network':\n result = await handleNetwork(command);\n break;\n\n case 'console':\n result = await handleConsole(command);\n break;\n\n case 'errors':\n result = await handleErrors(command);\n break;\n\n case 'trace':\n result = await handleTrace(command);\n break;\n\n default:\n result = {\n id: command.id,\n success: false,\n error: `Unknown action: ${command.action}`,\n };\n }\n } catch (error) {\n result = {\n id: command.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n\n await sendResult(result);\n}\n\n/**\n * 处理 open 命令 - 打开 URL\n * \n * 参数:\n * - url: 要打开的 URL\n * - tabId: 可选,指定在哪个 tab 中打开\n * - undefined: 创建新 tab(默认,并发安全)\n * - \"current\": 在当前活动 tab 中导航\n * - number: 在指定 tabId 的 tab 中导航\n */\nasync function handleOpen(command: CommandEvent): Promise<CommandResult> {\n const url = command.url as string;\n const tabIdParam = command.tabId as string | number | undefined;\n\n if (!url) {\n return {\n id: command.id,\n success: false,\n error: 'Missing url parameter',\n };\n }\n\n console.log('[CommandHandler] Opening URL:', url, 'tabId:', tabIdParam);\n\n let tab: chrome.tabs.Tab;\n\n if (tabIdParam === undefined) {\n // 默认行为:创建新 tab(并发安全)\n tab = await chrome.tabs.create({ url, active: true });\n } else if (tabIdParam === \"current\") {\n // 在当前活动 tab 中导航\n const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true });\n \n if (activeTab && activeTab.id) {\n tab = await chrome.tabs.update(activeTab.id, { url });\n } else {\n // 没有活动 tab,创建新的\n tab = await chrome.tabs.create({ url, active: true });\n }\n } else {\n // 在指定 tabId 的 tab 中导航\n const targetTabId = typeof tabIdParam === 'number' ? tabIdParam : parseInt(String(tabIdParam), 10);\n \n if (isNaN(targetTabId)) {\n return {\n id: command.id,\n success: false,\n error: `Invalid tabId: ${tabIdParam}`,\n };\n }\n\n try {\n tab = await chrome.tabs.update(targetTabId, { url, active: true });\n } catch (error) {\n return {\n id: command.id,\n success: false,\n error: `Tab ${targetTabId} not found or cannot be updated`,\n };\n }\n }\n\n // 等待页面加载完成\n await waitForTabLoad(tab.id!);\n\n // 获取页面信息\n const updatedTab = await chrome.tabs.get(tab.id!);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: tab.id,\n title: updatedTab.title || '',\n url: updatedTab.url || url,\n },\n };\n}\n\n/**\n * 处理 snapshot 命令 - 获取页面快照\n * v2.0: 使用 CDP Accessibility.getFullAXTree 获取可访问性树\n */\nasync function handleSnapshot(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面(chrome:// 或 about:)\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot take snapshot of restricted page: ${url}`,\n };\n }\n\n // 获取 interactive 参数,默认 false(完整树模式)\n const interactive = command.interactive as boolean | undefined;\n\n console.log('[CommandHandler] Taking snapshot of tab:', activeTab.id, activeTab.url, { interactive });\n\n try {\n // v2.0: 使用 CDP DOM Service 获取快照\n const snapshotResult = await cdpDom.getSnapshot(activeTab.id, { interactive });\n\n return {\n id: command.id,\n success: true,\n data: {\n title: activeTab.title || '',\n url: activeTab.url || '',\n snapshotData: snapshotResult,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Snapshot failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Snapshot failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 click 命令 - 点击元素\n * v2.0: 使用 CDP Input.dispatchMouseEvent\n */\nasync function handleClick(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Clicking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.clickElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Click failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Click failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 hover 命令 - 悬停在元素上\n * v2.0: 使用 CDP Input.dispatchMouseEvent\n */\nasync function handleHover(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Hovering element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.hoverElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Hover failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Hover failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 fill 命令 - 填充输入框\n */\nasync function handleFill(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const text = command.text as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (text === undefined || text === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing text parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Filling element:', ref, 'with text length:', text.length);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.fillElement(activeTab.id, ref, text);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n filledText: text,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Fill failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Fill failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 type 命令 - 逐字符输入文本(不清空原有内容)\n * v2.0: 使用 CDP Input.dispatchKeyEvent\n */\nasync function handleType(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const text = command.text as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (text === undefined || text === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing text parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Typing in element:', ref, 'text length:', text.length);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.typeElement(activeTab.id, ref, text);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n typedText: text,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Type failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Type failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 check 命令 - 勾选复选框\n */\nasync function handleCheck(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Checking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.checkElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n wasAlreadyChecked: elementInfo.wasAlreadyChecked,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Check failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Check failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 uncheck 命令 - 取消勾选复选框\n * v2.0: 使用 CDP Runtime.callFunctionOn\n */\nasync function handleUncheck(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Unchecking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.uncheckElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n wasAlreadyUnchecked: elementInfo.wasAlreadyUnchecked,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Uncheck failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Uncheck failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 select 命令 - 下拉框选择\n * v2.0: 使用 CDP Runtime.callFunctionOn\n */\nasync function handleSelect(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const value = command.value as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (value === undefined || value === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing value parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Selecting option:', ref, 'value:', value);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const result = await cdpDom.selectOption(activeTab.id, ref, value);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: result.role,\n name: result.name,\n selectedValue: result.selectedValue,\n selectedLabel: result.selectedLabel,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Select failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Select failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 close 命令 - 关闭当前标签页\n */\nasync function handleClose(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const title = activeTab.title || '';\n const url = activeTab.url || '';\n\n console.log('[CommandHandler] Closing tab:', tabId, url);\n\n try {\n await chrome.tabs.remove(tabId);\n\n // 清理 tab 相关状态\n cleanupDomTab(tabId);\n cleanupCdpTab(tabId);\n tabActiveFrameId.delete(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId,\n title,\n url,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Close failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Close failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 get 命令 - 获取页面或元素信息\n */\nasync function handleGet(command: CommandEvent): Promise<CommandResult> {\n const attribute = command.attribute as string;\n\n if (!attribute) {\n return {\n id: command.id,\n success: false,\n error: 'Missing attribute parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Getting:', attribute);\n\n try {\n let value: string;\n\n switch (attribute) {\n case 'url':\n value = activeTab.url || '';\n break;\n\n case 'title':\n value = activeTab.title || '';\n break;\n\n case 'text': {\n const ref = command.ref as string;\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter for get text',\n };\n }\n // v2.0: 使用 CDP DOM Service\n value = await cdpDom.getElementText(activeTab.id, ref);\n break;\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown attribute: ${attribute}`,\n };\n }\n\n return {\n id: command.id,\n success: true,\n data: {\n value,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Get failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Get failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 screenshot 命令 - 截取当前页面\n */\nasync function handleScreenshot(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id || !activeTab.windowId) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Taking screenshot of tab:', activeTab.id, activeTab.url);\n\n try {\n // 使用 chrome.tabs.captureVisibleTab 截图\n const dataUrl = await chrome.tabs.captureVisibleTab(activeTab.windowId, { format: 'png' });\n\n return {\n id: command.id,\n success: true,\n data: {\n dataUrl,\n title: activeTab.title || '',\n url: activeTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Screenshot failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Screenshot failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 wait 命令 - 等待时间或元素\n */\nasync function handleWait(command: CommandEvent): Promise<CommandResult> {\n const waitType = command.waitType as string;\n\n if (waitType === 'time') {\n // 等待指定时间\n const ms = command.ms as number;\n if (!ms || ms < 0) {\n return {\n id: command.id,\n success: false,\n error: 'Invalid ms parameter',\n };\n }\n\n console.log('[CommandHandler] Waiting for', ms, 'ms');\n await new Promise(resolve => setTimeout(resolve, ms));\n\n return {\n id: command.id,\n success: true,\n data: { waited: ms },\n };\n } else if (waitType === 'element') {\n // 等待元素出现\n const ref = command.ref as string;\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Waiting for element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.waitForElement(activeTab.id, ref);\n return {\n id: command.id,\n success: true,\n data: { ref },\n };\n } catch (error) {\n console.error('[CommandHandler] Wait failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Wait failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n } else {\n return {\n id: command.id,\n success: false,\n error: `Unknown wait type: ${waitType}`,\n };\n }\n}\n\n/**\n * 处理 press 命令 - 发送键盘按键\n */\nasync function handlePress(command: CommandEvent): Promise<CommandResult> {\n const key = command.key as string;\n const modifiers = (command.modifiers as string[]) || [];\n\n if (!key) {\n return {\n id: command.id,\n success: false,\n error: 'Missing key parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot send keys to restricted page: ${url}`,\n };\n }\n\n console.log('[CommandHandler] Pressing key:', key, 'modifiers:', modifiers);\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.pressKey(activeTab.id, key, modifiers);\n\n const displayKey = modifiers.length > 0 ? `${modifiers.join('+')}+${key}` : key;\n\n return {\n id: command.id,\n success: true,\n data: {\n key: displayKey,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Press failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Press failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 scroll 命令 - 滚动页面\n * v2.0: 使用 CDP Input.dispatchMouseEvent (wheel)\n */\nasync function handleScroll(command: CommandEvent): Promise<CommandResult> {\n const direction = command.direction as string;\n const pixels = (command.pixels as number) || 300;\n\n if (!direction) {\n return {\n id: command.id,\n success: false,\n error: 'Missing direction parameter',\n };\n }\n\n if (!['up', 'down', 'left', 'right'].includes(direction)) {\n return {\n id: command.id,\n success: false,\n error: `Invalid direction: ${direction}`,\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Scrolling:', direction, pixels, 'px');\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.scrollPage(activeTab.id, direction as 'up' | 'down' | 'left' | 'right', pixels);\n\n return {\n id: command.id,\n success: true,\n data: {\n direction,\n pixels,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Scroll failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Scroll failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 back 命令 - 后退\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleBack(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n console.log('[CommandHandler] Going back in tab:', tabId);\n\n try {\n // v2.0: 使用 CDP Service\n // 先检查是否可以后退\n const canGoBack = await cdp.evaluate(tabId, 'window.history.length > 1');\n \n if (!canGoBack) {\n return {\n id: command.id,\n success: false,\n error: 'No previous page in history',\n };\n }\n \n // 执行后退\n await cdp.evaluate(tabId, 'window.history.back()');\n \n // 等待页面加载\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const updatedTab = await chrome.tabs.get(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Back failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Back failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 forward 命令 - 前进\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleForward(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n console.log('[CommandHandler] Going forward in tab:', tabId);\n\n try {\n // v2.0: 使用 CDP Service\n await cdp.evaluate(tabId, 'window.history.forward()');\n \n // 等待页面加载\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const updatedTab = await chrome.tabs.get(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Forward failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Forward failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 refresh 命令 - 刷新页面\n */\nasync function handleRefresh(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Refreshing tab:', activeTab.id);\n\n try {\n await chrome.tabs.reload(activeTab.id);\n await waitForTabLoad(activeTab.id);\n const updatedTab = await chrome.tabs.get(activeTab.id);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Refresh failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Refresh failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 eval 命令 - 在页面执行 JavaScript\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleEval(command: CommandEvent): Promise<CommandResult> {\n const script = command.script as string;\n\n if (!script) {\n return {\n id: command.id,\n success: false,\n error: 'Missing script parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot execute script on restricted page: ${url}`,\n };\n }\n\n console.log('[CommandHandler] Evaluating script:', script.substring(0, 100));\n\n const tabId = activeTab.id;\n\n try {\n // v2.0: 使用 CDP Service\n const result = await cdp.evaluate(tabId, script);\n\n console.log('[CommandHandler] Eval result:', JSON.stringify(result));\n\n return {\n id: command.id,\n success: true,\n data: {\n result,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Eval failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Eval failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n// v2.0: 状态管理已移到 cdp-service.ts\n\n/**\n * 处理 tab_list 命令 - 列出所有标签页\n */\nasync function handleTabList(command: CommandEvent): Promise<CommandResult> {\n console.log('[CommandHandler] Listing all tabs');\n\n try {\n // 获取当前窗口的所有标签页\n const tabs = await chrome.tabs.query({ currentWindow: true });\n\n // 转换为 TabInfo 格式\n const tabInfos = tabs.map(tab => ({\n index: tab.index,\n url: tab.url || '',\n title: tab.title || '',\n active: tab.active || false,\n tabId: tab.id || 0,\n }));\n\n // 找到当前活动标签页的索引\n const activeTab = tabInfos.find(t => t.active);\n const activeIndex = activeTab?.index ?? 0;\n\n return {\n id: command.id,\n success: true,\n data: {\n tabs: tabInfos,\n activeIndex,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab list failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab list failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_new 命令 - 新建标签页\n */\nasync function handleTabNew(command: CommandEvent): Promise<CommandResult> {\n const url = command.url as string | undefined;\n\n console.log('[CommandHandler] Creating new tab:', url || 'about:blank');\n\n try {\n const createOptions: chrome.tabs.CreateProperties = { active: true };\n if (url) {\n createOptions.url = url;\n }\n\n const tab = await chrome.tabs.create(createOptions);\n\n // 如果有 URL,等待页面加载完成\n if (url && tab.id) {\n await waitForTabLoad(tab.id);\n }\n\n // 获取最新的标签页信息\n const updatedTab = tab.id ? await chrome.tabs.get(tab.id) : tab;\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: updatedTab.id,\n title: updatedTab.title || '',\n url: updatedTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab new failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab new failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_select 命令 - 切换到指定标签页\n */\nasync function handleTabSelect(command: CommandEvent): Promise<CommandResult> {\n const index = command.index as number | undefined;\n const tabIdParam = command.tabId as number | undefined;\n\n if (index === undefined && tabIdParam === undefined) {\n return {\n id: command.id,\n success: false,\n error: 'Missing index or tabId parameter',\n };\n }\n\n console.log('[CommandHandler] Selecting tab:', tabIdParam !== undefined ? `tabId=${tabIdParam}` : `index=${index}`);\n\n try {\n let targetTab: chrome.tabs.Tab;\n\n if (tabIdParam !== undefined) {\n // 按 tabId 直接定位\n targetTab = await chrome.tabs.get(tabIdParam);\n } else {\n // 按 index 定位(兼容旧逻辑)\n const tabs = await chrome.tabs.query({ currentWindow: true });\n const found = tabs.find(t => t.index === index);\n\n if (!found || !found.id) {\n return {\n id: command.id,\n success: false,\n error: `No tab found at index ${index} (total tabs: ${tabs.length})`,\n };\n }\n targetTab = found;\n }\n\n // 激活标签页\n await chrome.tabs.update(targetTab.id!, { active: true });\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: targetTab.id,\n title: targetTab.title || '',\n url: targetTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab select failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab select failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_close 命令 - 关闭标签页\n */\nasync function handleTabClose(command: CommandEvent): Promise<CommandResult> {\n const index = command.index as number | undefined;\n const tabIdParam = command.tabId as number | undefined;\n\n console.log('[CommandHandler] Closing tab:', tabIdParam !== undefined ? `tabId=${tabIdParam}` : (index !== undefined ? `index=${index}` : 'current'));\n\n try {\n let targetTab: chrome.tabs.Tab;\n\n if (tabIdParam !== undefined) {\n // 按 tabId 直接定位\n targetTab = await chrome.tabs.get(tabIdParam);\n } else if (index !== undefined) {\n // 按 index 定位(兼容旧逻辑)\n const tabs = await chrome.tabs.query({ currentWindow: true });\n const found = tabs.find(t => t.index === index);\n\n if (!found || !found.id) {\n return {\n id: command.id,\n success: false,\n error: `No tab found at index ${index} (total tabs: ${tabs.length})`,\n };\n }\n\n targetTab = found;\n } else {\n // 关闭当前活动标签页\n const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true });\n\n if (!activeTab || !activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n targetTab = activeTab;\n }\n\n const tabId = targetTab.id!;\n const title = targetTab.title || '';\n const url = targetTab.url || '';\n\n await chrome.tabs.remove(tabId);\n\n // 清理 tab 相关状态\n cleanupDomTab(tabId);\n cleanupCdpTab(tabId);\n tabActiveFrameId.delete(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId,\n title,\n url,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab close failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab close failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 frame 命令 - 切换到指定 iframe\n */\nasync function handleFrame(command: CommandEvent): Promise<CommandResult> {\n const selector = command.selector as string;\n\n if (!selector) {\n return {\n id: command.id,\n success: false,\n error: 'Missing selector parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n console.log('[CommandHandler] Switching to frame:', selector);\n\n try {\n // 1. 在页面中找到 iframe 元素并获取其信息\n const iframeInfoResults = await chrome.scripting.executeScript({\n target: { tabId, frameIds: tabActiveFrameId.get(tabId) !== null && tabActiveFrameId.get(tabId) !== undefined ? [tabActiveFrameId.get(tabId)!] : [0] },\n func: (sel: string) => {\n const iframe = document.querySelector(sel) as HTMLIFrameElement | null;\n if (!iframe) {\n return { found: false, error: `找不到 iframe: ${sel}` };\n }\n if (iframe.tagName.toLowerCase() !== 'iframe' && iframe.tagName.toLowerCase() !== 'frame') {\n return { found: false, error: `元素不是 iframe: ${iframe.tagName}` };\n }\n return {\n found: true,\n name: iframe.name || '',\n src: iframe.src || '',\n // 获取 iframe 在页面中的位置用于匹配\n rect: iframe.getBoundingClientRect(),\n };\n },\n args: [selector],\n });\n\n const iframeInfo = iframeInfoResults[0]?.result as {\n found: boolean;\n error?: string;\n name?: string;\n src?: string;\n rect?: DOMRect;\n };\n\n if (!iframeInfo || !iframeInfo.found) {\n return {\n id: command.id,\n success: false,\n error: iframeInfo?.error || `找不到 iframe: ${selector}`,\n };\n }\n\n // 2. 获取所有 frames\n const frames = await chrome.webNavigation.getAllFrames({ tabId });\n\n if (!frames || frames.length === 0) {\n return {\n id: command.id,\n success: false,\n error: '无法获取页面 frames',\n };\n }\n\n // 3. 尝试通过 URL 或 name 匹配 frameId\n let targetFrameId: number | null = null;\n\n // 首先尝试通过 src URL 匹配\n if (iframeInfo.src) {\n const matchedFrame = frames.find(f => \n f.url === iframeInfo.src || \n f.url.includes(iframeInfo.src!) ||\n iframeInfo.src!.includes(f.url)\n );\n if (matchedFrame) {\n targetFrameId = matchedFrame.frameId;\n }\n }\n\n // 如果没有匹配到,尝试通过非主 frame 排除\n if (targetFrameId === null) {\n // 获取非主 frame 的列表(排除 frameId 为 0 的主 frame)\n const childFrames = frames.filter(f => f.frameId !== 0);\n \n if (childFrames.length === 1) {\n // 只有一个子 frame,直接使用它\n targetFrameId = childFrames[0].frameId;\n } else if (childFrames.length > 1) {\n // 多个子 frame,尝试用 name 匹配\n if (iframeInfo.name) {\n // 目前无法直接通过 name 匹配,需要更复杂的逻辑\n // 暂时使用第一个匹配 URL 的 frame\n console.log('[CommandHandler] Multiple frames found, using URL matching');\n }\n \n // 如果还是没找到,返回错误\n if (targetFrameId === null) {\n return {\n id: command.id,\n success: false,\n error: `找到多个子 frame,无法确定目标。请使用更精确的 selector 或确保 iframe 有 src 属性。`,\n };\n }\n } else {\n return {\n id: command.id,\n success: false,\n error: '页面中没有子 frame',\n };\n }\n }\n\n // 4. 验证 frameId 是否有效(尝试在该 frame 中执行脚本)\n try {\n await chrome.scripting.executeScript({\n target: { tabId, frameIds: [targetFrameId] },\n func: () => true,\n });\n } catch (e) {\n return {\n id: command.id,\n success: false,\n error: `无法访问 frame (frameId: ${targetFrameId}),可能是跨域 iframe`,\n };\n }\n\n // 5. 保存 activeFrameId 并同步到 cdp-dom-service\n tabActiveFrameId.set(tabId, targetFrameId);\n cdpDom.setActiveFrameId(tabId, String(targetFrameId));\n\n const matchedFrameInfo = frames.find(f => f.frameId === targetFrameId);\n\n return {\n id: command.id,\n success: true,\n data: {\n frameInfo: {\n selector,\n name: iframeInfo.name,\n url: matchedFrameInfo?.url || iframeInfo.src,\n frameId: targetFrameId,\n },\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Frame switch failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Frame switch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 frame_main 命令 - 返回主 frame\n */\nasync function handleFrameMain(command: CommandEvent): Promise<CommandResult> {\n console.log('[CommandHandler] Switching to main frame');\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n // 重置 activeFrameId 并同步到 cdp-dom-service\n tabActiveFrameId.set(tabId, null);\n cdpDom.setActiveFrameId(tabId, null);\n\n return {\n id: command.id,\n success: true,\n data: {\n frameInfo: {\n frameId: 0,\n },\n },\n };\n}\n\n/**\n * 处理 dialog 命令 - 接受或拒绝对话框\n * v2.0: 使用 CDP Page.handleJavaScriptDialog\n */\nasync function handleDialog(command: CommandEvent): Promise<CommandResult> {\n const dialogResponse = command.dialogResponse as 'accept' | 'dismiss';\n const promptText = command.promptText as string | undefined;\n\n if (!dialogResponse || !['accept', 'dismiss'].includes(dialogResponse)) {\n return {\n id: command.id,\n success: false,\n error: 'Missing or invalid dialogResponse parameter (accept/dismiss)',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n console.log('[CommandHandler] Handling dialog:', dialogResponse, 'promptText:', promptText);\n\n try {\n // v2.0: 使用 CDP Service\n const pendingDialog = cdp.getPendingDialog(tabId);\n\n if (!pendingDialog) {\n return {\n id: command.id,\n success: false,\n error: '没有待处理的对话框',\n };\n }\n\n // 处理 dialog\n await cdp.handleJavaScriptDialog(\n tabId,\n dialogResponse === 'accept',\n dialogResponse === 'accept' ? promptText : undefined\n );\n\n // 获取 dialog 信息\n const dialogInfo = {\n type: pendingDialog.type,\n message: pendingDialog.message,\n handled: true,\n };\n\n return {\n id: command.id,\n success: true,\n data: {\n dialogInfo,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Dialog handling failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Dialog failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 等待标签页加载完成\n */\nfunction waitForTabLoad(tabId: number, timeout = 30000): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n chrome.tabs.onUpdated.removeListener(listener);\n reject(new Error('Tab load timeout'));\n }, timeout);\n\n const listener = (updatedTabId: number, changeInfo: chrome.tabs.TabChangeInfo) => {\n if (updatedTabId === tabId && changeInfo.status === 'complete') {\n clearTimeout(timeoutId);\n chrome.tabs.onUpdated.removeListener(listener);\n resolve();\n }\n };\n\n chrome.tabs.onUpdated.addListener(listener);\n });\n}\n\n// ============================================================================\n// Network/Console/Errors 命令处理\n// ============================================================================\n\n/**\n * 处理 network 命令 - 网络监控和拦截\n */\nasync function handleNetwork(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = command.networkCommand as string;\n const urlPattern = command.url as string | undefined;\n\n console.log('[CommandHandler] Network command:', subCommand, urlPattern);\n\n try {\n switch (subCommand) {\n case 'requests': {\n // 确保网络监控已启用\n await cdp.enableNetwork(tabId);\n const filter = command.filter as string | undefined;\n const requests = cdp.getNetworkRequests(tabId, filter);\n \n // 转换为简化格式\n const networkRequests = requests.map(r => ({\n requestId: r.requestId,\n url: r.url,\n method: r.method,\n type: r.type,\n timestamp: r.timestamp,\n status: r.response?.status,\n statusText: r.response?.statusText,\n failed: r.failed,\n failureReason: r.failureReason,\n }));\n\n return {\n id: command.id,\n success: true,\n data: {\n networkRequests,\n },\n };\n }\n\n case 'route': {\n if (!urlPattern) {\n return {\n id: command.id,\n success: false,\n error: 'URL pattern required for route command',\n };\n }\n \n const options = command.routeOptions || {};\n await cdp.addNetworkRoute(tabId, urlPattern, options);\n const routeCount = cdp.getNetworkRoutes(tabId).length;\n\n return {\n id: command.id,\n success: true,\n data: {\n routeCount,\n },\n };\n }\n\n case 'unroute': {\n cdp.removeNetworkRoute(tabId, urlPattern);\n const routeCount = cdp.getNetworkRoutes(tabId).length;\n\n return {\n id: command.id,\n success: true,\n data: {\n routeCount,\n },\n };\n }\n\n case 'clear': {\n cdp.clearNetworkRequests(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown network subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Network command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Network command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 console 命令 - 控制台消息\n */\nasync function handleConsole(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = (command.consoleCommand || 'get') as string;\n\n console.log('[CommandHandler] Console command:', subCommand);\n\n try {\n // 确保 console 监控已启用\n await cdp.enableConsole(tabId);\n\n switch (subCommand) {\n case 'get': {\n const messages = cdp.getConsoleMessages(tabId);\n return {\n id: command.id,\n success: true,\n data: {\n consoleMessages: messages,\n },\n };\n }\n\n case 'clear': {\n cdp.clearConsoleMessages(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown console subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Console command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Console command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 errors 命令 - JS 错误\n */\nasync function handleErrors(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = (command.errorsCommand || 'get') as string;\n\n console.log('[CommandHandler] Errors command:', subCommand);\n\n try {\n // 确保 console 监控已启用(errors 也通过 Runtime 捕获)\n await cdp.enableConsole(tabId);\n\n switch (subCommand) {\n case 'get': {\n const errors = cdp.getJSErrors(tabId);\n return {\n id: command.id,\n success: true,\n data: {\n jsErrors: errors,\n },\n };\n }\n\n case 'clear': {\n cdp.clearJSErrors(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown errors subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Errors command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Errors command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 trace 命令 - 录制用户操作\n */\nasync function handleTrace(command: CommandEvent): Promise<CommandResult> {\n const subCommand = (command.traceCommand || 'status') as string;\n\n console.log('[CommandHandler] Trace command:', subCommand);\n\n try {\n switch (subCommand) {\n case 'start': {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot record on restricted page: ${url}`,\n };\n }\n\n // 开始录制\n await traceService.startRecording(activeTab.id);\n const status = traceService.getStatus();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceStatus: status,\n },\n };\n }\n\n case 'stop': {\n // 停止录制并获取事件\n const events = await traceService.stopRecording();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceEvents: events,\n traceStatus: {\n recording: false,\n eventCount: events.length,\n },\n },\n };\n }\n\n case 'status': {\n const status = traceService.getStatus();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceStatus: status,\n },\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown trace subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Trace command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Trace command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n","/**\n * bb-browser Background Service Worker\n *\n * 负责:\n * - 通过 SSE 连接 Daemon 接收命令\n * - 协调 Content Scripts\n * - 管理扩展状态\n * - 使用 chrome.alarms 保持 Service Worker 活跃\n */\n\nimport { SSEClient } from './sse-client';\nimport { handleCommand } from './command-handler';\n\n// 保活 Alarm 名称\nconst KEEPALIVE_ALARM = 'bb-browser-keepalive';\n\n// 创建 SSE 客户端\nconst sseClient = new SSEClient();\n\n// 注册命令处理器\nsseClient.onCommand(handleCommand);\n\n// 监听来自 Content Script 的消息\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n console.log('[bb-browser] Message from content script:', message, 'sender:', sender.tab?.id);\n sendResponse({ received: true });\n return true;\n});\n\n// 设置保活 Alarm(每 25 秒触发一次,防止 Service Worker 休眠)\nasync function setupKeepaliveAlarm() {\n // 先清除可能存在的旧 alarm\n await chrome.alarms.clear(KEEPALIVE_ALARM);\n \n // 创建新的 alarm,periodInMinutes 最小值是 0.5(30秒),但我们可以用更短的\n // MV3 允许 periodInMinutes >= 0.5,但 delayInMinutes 可以更短\n // 使用 0.4 分钟 = 24 秒\n await chrome.alarms.create(KEEPALIVE_ALARM, {\n periodInMinutes: 0.4, // 24 秒\n });\n \n console.log('[bb-browser] Keepalive alarm set (every 24s)');\n}\n\n// Alarm 触发时检查并重连\nchrome.alarms.onAlarm.addListener((alarm) => {\n if (alarm.name === KEEPALIVE_ALARM) {\n console.log('[bb-browser] Keepalive alarm triggered, checking connection...');\n \n // 检查 SSE 连接状态,如果断开则重连\n if (!sseClient.isConnected()) {\n console.log('[bb-browser] SSE disconnected, reconnecting...');\n sseClient.connect();\n }\n }\n});\n\n// 扩展安装/更新事件\nchrome.runtime.onInstalled.addListener((details) => {\n console.log('[bb-browser] Extension installed/updated:', details.reason);\n // 安装后自动连接\n sseClient.connect();\n setupKeepaliveAlarm();\n});\n\n// Service Worker 启动时连接\nchrome.runtime.onStartup.addListener(() => {\n console.log('[bb-browser] Browser started, connecting to daemon...');\n sseClient.connect();\n setupKeepaliveAlarm();\n});\n\n// 立即尝试连接(处理扩展重载的情况)\nconsole.log('[bb-browser] Background service worker started, connecting to daemon...');\nsseClient.connect();\nsetupKeepaliveAlarm();\n"],"names":["pressKey","cleanupTab","tabSnapshotRefs","tabActiveFrameId","getSnapshot","legacyGetSnapshot","cdp.evaluate","cdp.click","cdp.moveMouse","cdp.insertText","cdp.pressKey","cdp.scroll","cdp.initEventListeners","cdpDom.getSnapshot","cdpDom.clickElement","cdpDom.hoverElement","cdpDom.fillElement","cdpDom.typeElement","cdpDom.checkElement","cdpDom.uncheckElement","cdpDom.selectOption","cleanupDomTab","cleanupCdpTab","cdpDom.getElementText","cdpDom.waitForElement","cdpDom.pressKey","cdpDom.scrollPage","cdpDom.setActiveFrameId","cdp.getPendingDialog","cdp.handleJavaScriptDialog","cdp.enableNetwork","cdp.getNetworkRequests","cdp.addNetworkRoute","cdp.getNetworkRoutes","cdp.removeNetworkRoute","cdp.clearNetworkRequests","cdp.enableConsole","cdp.getConsoleMessages","cdp.clearConsoleMessages","cdp.getJSErrors","cdp.clearJSErrors","traceService.startRecording","traceService.getStatus","traceService.stopRecording"],"mappings":"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"}
1
+ {"version":3,"file":"background.js","sources":["../src/background/constants.ts","../src/background/sse-client.ts","../src/background/api-client.ts","../src/background/cdp-service.ts","../src/background/dom-service.ts","../src/background/cdp-dom-service.ts","../src/background/trace-service.ts","../src/background/command-handler.ts","../src/background/index.ts"],"sourcesContent":["/**\n * bb-browser Extension Constants\n */\n\nexport const DEFAULT_DAEMON_PORT = 19824;\nexport const DEFAULT_DAEMON_HOST = 'localhost';\nexport const DEFAULT_DAEMON_BASE_URL = `http://${DEFAULT_DAEMON_HOST}:${DEFAULT_DAEMON_PORT}`;\n\n// 保持向后兼容的导出\nexport const DAEMON_PORT = DEFAULT_DAEMON_PORT;\nexport const DAEMON_HOST = DEFAULT_DAEMON_HOST;\nexport const DAEMON_BASE_URL = DEFAULT_DAEMON_BASE_URL;\n\nexport const SSE_RECONNECT_DELAY = 3000; // 3 秒\nexport const SSE_MAX_RECONNECT_ATTEMPTS = 5;\n\nconst STORAGE_KEY = 'upstreamUrl';\n\n/**\n * 获取上游 URL(从 storage 读取,无配置时用默认值)\n */\nexport async function getUpstreamUrl(): Promise<string> {\n try {\n const result = await chrome.storage.sync.get(STORAGE_KEY);\n const url = result[STORAGE_KEY];\n if (url && typeof url === 'string' && url.trim()) {\n return url.trim().replace(/\\/+$/, ''); // 去掉尾部 /\n }\n } catch {\n // storage 不可用时用默认值\n }\n return DEFAULT_DAEMON_BASE_URL;\n}\n\n/**\n * 设置上游 URL\n */\nexport async function setUpstreamUrl(url: string): Promise<void> {\n await chrome.storage.sync.set({ [STORAGE_KEY]: url });\n}\n","/**\n * SSE Client for bb-browser Extension\n * 使用 fetch + ReadableStream 实现,兼容 Service Worker (Manifest V3)\n */\n\nimport { getUpstreamUrl, SSE_RECONNECT_DELAY, SSE_MAX_RECONNECT_ATTEMPTS } from './constants';\n\nexport interface SSEEvent {\n type: 'connected' | 'heartbeat' | 'command';\n data: unknown;\n}\n\nexport interface CommandEvent {\n id: string;\n action: string;\n [key: string]: unknown;\n}\n\nexport type CommandHandler = (command: CommandEvent) => void | Promise<void>;\n\nexport class SSEClient {\n private abortController: AbortController | null = null;\n private reconnectAttempts = 0;\n private isConnectedFlag = false;\n private onCommandHandler: CommandHandler | null = null;\n\n /**\n * 连接到 Daemon SSE 端点\n */\n async connect(): Promise<void> {\n if (this.abortController) {\n console.warn('[SSEClient] Already connected');\n return;\n }\n\n const baseUrl = await getUpstreamUrl();\n const sseUrl = `${baseUrl}/sse`;\n console.log('[SSEClient] Connecting to:', sseUrl);\n this.abortController = new AbortController();\n\n try {\n const response = await fetch(sseUrl, {\n signal: this.abortController.signal,\n headers: {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n },\n keepalive: true,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n const contentType = response.headers.get('Content-Type');\n console.log('[SSEClient] Connection established, Content-Type:', contentType);\n\n this.isConnectedFlag = true;\n this.reconnectAttempts = 0;\n\n await this.readStream(response.body);\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('[SSEClient] Connection aborted');\n return;\n }\n\n console.error('[SSEClient] Connection error:', error);\n this.isConnectedFlag = false;\n this.reconnect();\n }\n }\n\n /**\n * 读取并解析 SSE 流\n */\n private async readStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let event = '';\n let data = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n console.log('[SSEClient] Stream ended');\n this.isConnectedFlag = false;\n this.reconnect();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (trimmedLine.startsWith('event:')) {\n event = trimmedLine.substring(6).trim();\n } else if (trimmedLine.startsWith('data:')) {\n data = trimmedLine.substring(5).trim();\n } else if (trimmedLine === '') {\n if (event && data) {\n // 不 await,允许多个命令并发执行\n this.handleMessage(event, data).catch(err =>\n console.error('[SSEClient] handleMessage error:', err)\n );\n event = '';\n data = '';\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n console.log('[SSEClient] Stream reading aborted');\n return;\n }\n console.error('[SSEClient] Stream reading error:', error);\n this.isConnectedFlag = false;\n this.reconnect();\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * 处理 SSE 消息\n */\n private async handleMessage(event: string, data: string): Promise<void> {\n try {\n const parsed = JSON.parse(data);\n\n switch (event) {\n case 'connected':\n console.log('[SSEClient] Connection confirmed:', parsed);\n break;\n\n case 'heartbeat':\n console.log('[SSEClient] Heartbeat:', new Date(parsed.time * 1000).toISOString());\n break;\n\n case 'command':\n console.log('[SSEClient] Command received:', parsed.id, parsed.action);\n if (this.onCommandHandler) {\n await this.onCommandHandler(parsed as CommandEvent);\n } else {\n console.warn('[SSEClient] No command handler registered');\n }\n break;\n\n default:\n console.log('[SSEClient] Unknown event type:', event);\n }\n } catch (error) {\n console.error('[SSEClient] Error handling message:', error);\n }\n }\n\n /**\n * 指数退避重连\n */\n private reconnect(): void {\n if (this.reconnectAttempts >= SSE_MAX_RECONNECT_ATTEMPTS) {\n console.error('[SSEClient] Max reconnection attempts reached');\n return;\n }\n\n this.reconnectAttempts++;\n const delay = SSE_RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[SSEClient] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${SSE_MAX_RECONNECT_ATTEMPTS})`\n );\n\n setTimeout(() => {\n this.disconnect();\n this.connect();\n }, delay);\n }\n\n /**\n * 注册命令处理器\n */\n onCommand(handler: CommandHandler): void {\n this.onCommandHandler = handler;\n }\n\n /**\n * 断开连接\n */\n disconnect(): void {\n if (this.abortController) {\n console.log('[SSEClient] Disconnecting...');\n this.abortController.abort();\n this.abortController = null;\n this.isConnectedFlag = false;\n }\n }\n\n /**\n * 检查连接状态\n */\n isConnected(): boolean {\n return this.isConnectedFlag;\n }\n}\n","/**\n * API Client for bb-browser Extension\n * 负责向 Daemon 回传命令执行结果\n */\n\nimport { getUpstreamUrl } from './constants';\n\nexport interface CommandResult {\n id: string;\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\n/**\n * 向 Daemon 发送命令执行结果\n */\nexport async function sendResult(result: CommandResult): Promise<void> {\n const baseUrl = await getUpstreamUrl();\n const url = `${baseUrl}/result`;\n console.log('[APIClient] Sending result:', result.id, result.success);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(result),\n });\n\n if (!response.ok) {\n console.error('[APIClient] Failed to send result:', response.status, response.statusText);\n return;\n }\n\n const data = await response.json();\n console.log('[APIClient] Result sent successfully:', data);\n } catch (error) {\n console.error('[APIClient] Error sending result:', error);\n }\n}\n","/**\n * CDP Service for bb-browser Extension\n * \n * 封装 chrome.debugger API,提供统一的 CDP 调用接口。\n * 所有 DOM 操作、输入模拟、脚本执行都通过这个服务层进行。\n */\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** CDP 命令结果的基础类型 */\ninterface CDPResult {\n [key: string]: unknown;\n}\n\n/** Runtime.evaluate 的结果 */\ninterface RuntimeEvaluateResult {\n result?: {\n type: string;\n value?: unknown;\n objectId?: string;\n description?: string;\n subtype?: string;\n };\n exceptionDetails?: {\n exception?: { description?: string };\n text?: string;\n };\n}\n\n/** DOM.getDocument 的结果 */\ninterface DOMGetDocumentResult {\n root: {\n nodeId: number;\n backendNodeId: number;\n nodeType: number;\n nodeName: string;\n childNodeCount?: number;\n children?: DOMNode[];\n };\n}\n\n/** DOM 节点类型 */\ninterface DOMNode {\n nodeId: number;\n backendNodeId: number;\n nodeType: number;\n nodeName: string;\n localName?: string;\n nodeValue?: string;\n childNodeCount?: number;\n children?: DOMNode[];\n attributes?: string[];\n frameId?: string;\n contentDocument?: DOMNode;\n shadowRoots?: DOMNode[];\n}\n\n/** DOM.querySelector 的结果 */\ninterface DOMQuerySelectorResult {\n nodeId: number;\n}\n\n/** DOM.getBoxModel 的结果 */\ninterface DOMGetBoxModelResult {\n model: {\n content: number[]; // [x1, y1, x2, y2, x3, y3, x4, y4]\n padding: number[];\n border: number[];\n margin: number[];\n width: number;\n height: number;\n };\n}\n\n/** DOM.resolveNode 的结果 */\ninterface DOMResolveNodeResult {\n object: {\n type: string;\n objectId?: string;\n className?: string;\n description?: string;\n };\n}\n\n/** Page.captureScreenshot 的结果 */\ninterface PageCaptureScreenshotResult {\n data: string; // base64 encoded\n}\n\n/** Accessibility.getFullAXTree 的结果 */\ninterface AccessibilityGetFullAXTreeResult {\n nodes: AXNode[];\n}\n\n/** 可访问性树节点 */\nexport interface AXNode {\n nodeId: string;\n ignored: boolean;\n role?: { type: string; value?: string };\n name?: { type: string; value?: string; sources?: unknown[] };\n description?: { type: string; value?: string };\n value?: { type: string; value?: unknown };\n properties?: Array<{\n name: string;\n value: { type: string; value?: unknown };\n }>;\n childIds?: string[];\n backendDOMNodeId?: number;\n frameId?: string;\n}\n\n/** Dialog 信息 */\nexport interface DialogInfo {\n url: string;\n message: string;\n type: 'alert' | 'confirm' | 'prompt' | 'beforeunload';\n defaultPrompt?: string;\n hasBrowserHandler: boolean;\n}\n\n/** 网络请求信息 */\nexport interface NetworkRequest {\n requestId: string;\n url: string;\n method: string;\n type: string;\n timestamp: number;\n headers?: Record<string, string>;\n postData?: string;\n response?: {\n status: number;\n statusText: string;\n headers?: Record<string, string>;\n mimeType?: string;\n };\n failed?: boolean;\n failureReason?: string;\n}\n\n/** 控制台消息 */\nexport interface ConsoleMessage {\n type: 'log' | 'info' | 'warn' | 'error' | 'debug';\n text: string;\n timestamp: number;\n url?: string;\n lineNumber?: number;\n}\n\n/** JS 异常错误 */\nexport interface JSError {\n message: string;\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: string;\n timestamp: number;\n}\n\n/** 网络拦截规则 */\nexport interface NetworkRoute {\n urlPattern: string;\n action: 'abort' | 'continue' | 'fulfill';\n body?: string;\n status?: number;\n headers?: Record<string, string>;\n}\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 已 attach 的 tab 集合 */\nconst attachedTabs = new Set<number>();\n\n/** 待处理的 dialog 信息 */\nconst pendingDialogs = new Map<number, DialogInfo>();\n\n/** 网络请求记录(每个 tab 最多保留 500 条) */\nconst networkRequests = new Map<number, NetworkRequest[]>();\n\n/** 控制台消息记录(每个 tab 最多保留 500 条) */\nconst consoleMessages = new Map<number, ConsoleMessage[]>();\n\n/** JS 错误记录(每个 tab 最多保留 100 条) */\nconst jsErrors = new Map<number, JSError[]>();\n\n/** 网络拦截规则 */\nconst networkRoutes = new Map<number, NetworkRoute[]>();\n\n/** 是否已启用网络监控的 tab */\nconst networkEnabledTabs = new Set<number>();\n\nconst MAX_REQUESTS = 500;\nconst MAX_CONSOLE_MESSAGES = 500;\nconst MAX_ERRORS = 100;\n\n// ============================================================================\n// 核心 CDP 调用\n// ============================================================================\n\n/**\n * 确保 debugger 已附加到指定 tab\n */\nexport async function ensureAttached(tabId: number): Promise<void> {\n if (attachedTabs.has(tabId)) {\n return;\n }\n\n try {\n await chrome.debugger.attach({ tabId }, '1.3');\n attachedTabs.add(tabId);\n \n // 启用必要的 CDP 域\n await chrome.debugger.sendCommand({ tabId }, 'Page.enable');\n await chrome.debugger.sendCommand({ tabId }, 'DOM.enable');\n await chrome.debugger.sendCommand({ tabId }, 'Runtime.enable');\n \n console.log('[CDPService] Attached to tab:', tabId);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n // 如果已经 attached,忽略错误\n if (msg.includes('Another debugger is already attached')) {\n attachedTabs.add(tabId);\n return;\n }\n throw error;\n }\n}\n\n/**\n * 从 tab 分离 debugger\n */\nexport async function detach(tabId: number): Promise<void> {\n if (!attachedTabs.has(tabId)) {\n return;\n }\n\n try {\n await chrome.debugger.detach({ tabId });\n attachedTabs.delete(tabId);\n pendingDialogs.delete(tabId);\n console.log('[CDPService] Detached from tab:', tabId);\n } catch (error) {\n // 忽略 detach 错误\n attachedTabs.delete(tabId);\n }\n}\n\n/**\n * 发送 CDP 命令\n */\nexport async function sendCommand<T = CDPResult>(\n tabId: number,\n method: string,\n params?: object\n): Promise<T> {\n await ensureAttached(tabId);\n const result = await chrome.debugger.sendCommand({ tabId }, method, params);\n return result as T;\n}\n\n// ============================================================================\n// Runtime 域 - JavaScript 执行\n// ============================================================================\n\n/**\n * 在页面中执行 JavaScript 表达式\n */\nexport async function evaluate(\n tabId: number,\n expression: string,\n options: {\n returnByValue?: boolean;\n awaitPromise?: boolean;\n } = {}\n): Promise<unknown> {\n const result = await sendCommand<RuntimeEvaluateResult>(tabId, 'Runtime.evaluate', {\n expression,\n returnByValue: options.returnByValue ?? true,\n awaitPromise: options.awaitPromise ?? true,\n });\n\n if (result.exceptionDetails) {\n const errorMsg = result.exceptionDetails.exception?.description\n || result.exceptionDetails.text\n || 'Unknown error';\n throw new Error(`Eval error: ${errorMsg}`);\n }\n\n return result.result?.value;\n}\n\n/**\n * 调用对象上的函数\n */\nexport async function callFunctionOn(\n tabId: number,\n objectId: string,\n functionDeclaration: string,\n args: unknown[] = []\n): Promise<unknown> {\n const result = await sendCommand<RuntimeEvaluateResult>(tabId, 'Runtime.callFunctionOn', {\n objectId,\n functionDeclaration,\n arguments: args.map(arg => ({ value: arg })),\n returnByValue: true,\n awaitPromise: true,\n });\n\n if (result.exceptionDetails) {\n throw new Error(result.exceptionDetails.exception?.description || 'Call failed');\n }\n\n return result.result?.value;\n}\n\n// ============================================================================\n// DOM 域 - DOM 操作\n// ============================================================================\n\n/**\n * 获取文档根节点\n */\nexport async function getDocument(\n tabId: number,\n options: { depth?: number; pierce?: boolean } = {}\n): Promise<DOMNode> {\n const result = await sendCommand<DOMGetDocumentResult>(tabId, 'DOM.getDocument', {\n depth: options.depth ?? -1, // -1 表示获取整个树\n pierce: options.pierce ?? true, // 穿透 shadow DOM 和 iframe\n });\n return result.root;\n}\n\n/**\n * 使用选择器查询元素\n */\nexport async function querySelector(\n tabId: number,\n nodeId: number,\n selector: string\n): Promise<number> {\n const result = await sendCommand<DOMQuerySelectorResult>(tabId, 'DOM.querySelector', {\n nodeId,\n selector,\n });\n return result.nodeId;\n}\n\n/**\n * 获取元素的盒模型(用于计算点击位置)\n */\nexport async function getBoxModel(tabId: number, nodeId: number): Promise<DOMGetBoxModelResult['model']> {\n const result = await sendCommand<DOMGetBoxModelResult>(tabId, 'DOM.getBoxModel', {\n nodeId,\n });\n return result.model;\n}\n\n/**\n * 获取元素的盒模型(通过 backendNodeId)\n */\nexport async function getBoxModelByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<DOMGetBoxModelResult['model']> {\n const result = await sendCommand<DOMGetBoxModelResult>(tabId, 'DOM.getBoxModel', {\n backendNodeId,\n });\n return result.model;\n}\n\n/**\n * 将 nodeId 解析为 Runtime 对象\n */\nexport async function resolveNode(tabId: number, nodeId: number): Promise<string | undefined> {\n const result = await sendCommand<DOMResolveNodeResult>(tabId, 'DOM.resolveNode', {\n nodeId,\n });\n return result.object.objectId;\n}\n\n/**\n * 将 backendNodeId 解析为 Runtime 对象\n */\nexport async function resolveNodeByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<string | undefined> {\n const result = await sendCommand<DOMResolveNodeResult>(tabId, 'DOM.resolveNode', {\n backendNodeId,\n });\n return result.object.objectId;\n}\n\n/**\n * 聚焦到指定元素\n */\nexport async function focusElement(tabId: number, nodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.focus', { nodeId });\n}\n\n/**\n * 聚焦到指定元素(通过 backendNodeId)\n */\nexport async function focusElementByBackendId(tabId: number, backendNodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.focus', { backendNodeId });\n}\n\n/**\n * 滚动元素到可视区域\n */\nexport async function scrollIntoViewIfNeeded(tabId: number, nodeId: number): Promise<void> {\n await sendCommand(tabId, 'DOM.scrollIntoViewIfNeeded', { nodeId });\n}\n\n/**\n * 滚动元素到可视区域(通过 backendNodeId)\n */\nexport async function scrollIntoViewIfNeededByBackendId(\n tabId: number,\n backendNodeId: number\n): Promise<void> {\n await sendCommand(tabId, 'DOM.scrollIntoViewIfNeeded', { backendNodeId });\n}\n\n/**\n * 设置元素属性值(用于 input)\n */\nexport async function setAttributeValue(\n tabId: number,\n nodeId: number,\n name: string,\n value: string\n): Promise<void> {\n await sendCommand(tabId, 'DOM.setAttributeValue', { nodeId, name, value });\n}\n\n// ============================================================================\n// Input 域 - 输入模拟\n// ============================================================================\n\n/**\n * 分发鼠标事件\n */\nexport async function dispatchMouseEvent(\n tabId: number,\n type: 'mousePressed' | 'mouseReleased' | 'mouseMoved' | 'mouseWheel',\n x: number,\n y: number,\n options: {\n button?: 'left' | 'right' | 'middle' | 'none';\n clickCount?: number;\n deltaX?: number;\n deltaY?: number;\n modifiers?: number; // 1=Alt, 2=Ctrl, 4=Meta, 8=Shift\n } = {}\n): Promise<void> {\n await sendCommand(tabId, 'Input.dispatchMouseEvent', {\n type,\n x,\n y,\n button: options.button ?? 'left',\n clickCount: options.clickCount ?? 1,\n deltaX: options.deltaX ?? 0,\n deltaY: options.deltaY ?? 0,\n modifiers: options.modifiers ?? 0,\n });\n}\n\n/**\n * 点击指定坐标\n */\nexport async function click(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 1 });\n}\n\n/**\n * 双击指定坐标\n */\nexport async function doubleClick(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 1 });\n await dispatchMouseEvent(tabId, 'mousePressed', x, y, { button: 'left', clickCount: 2 });\n await dispatchMouseEvent(tabId, 'mouseReleased', x, y, { button: 'left', clickCount: 2 });\n}\n\n/**\n * 移动鼠标到指定坐标(用于 hover)\n */\nexport async function moveMouse(tabId: number, x: number, y: number): Promise<void> {\n await dispatchMouseEvent(tabId, 'mouseMoved', x, y);\n}\n\n/**\n * 滚动鼠标滚轮\n */\nexport async function scroll(\n tabId: number,\n x: number,\n y: number,\n deltaX: number,\n deltaY: number\n): Promise<void> {\n await dispatchMouseEvent(tabId, 'mouseWheel', x, y, { deltaX, deltaY });\n}\n\n/**\n * 分发键盘事件\n */\nexport async function dispatchKeyEvent(\n tabId: number,\n type: 'keyDown' | 'keyUp' | 'rawKeyDown' | 'char',\n options: {\n key?: string;\n code?: string;\n text?: string;\n modifiers?: number;\n windowsVirtualKeyCode?: number;\n nativeVirtualKeyCode?: number;\n } = {}\n): Promise<void> {\n await sendCommand(tabId, 'Input.dispatchKeyEvent', {\n type,\n ...options,\n });\n}\n\n/**\n * 按下并释放一个键\n */\nexport async function pressKey(\n tabId: number,\n key: string,\n options: { modifiers?: number } = {}\n): Promise<void> {\n // 特殊键的虚拟键码映射\n const keyCodeMap: Record<string, number> = {\n Enter: 13,\n Tab: 9,\n Backspace: 8,\n Escape: 27,\n ArrowUp: 38,\n ArrowDown: 40,\n ArrowLeft: 37,\n ArrowRight: 39,\n Delete: 46,\n Home: 36,\n End: 35,\n PageUp: 33,\n PageDown: 34,\n };\n\n const keyCode = keyCodeMap[key] || key.charCodeAt(0);\n\n await dispatchKeyEvent(tabId, 'rawKeyDown', {\n key,\n code: key,\n windowsVirtualKeyCode: keyCode,\n nativeVirtualKeyCode: keyCode,\n modifiers: options.modifiers,\n });\n\n // 对于可打印字符,发送 char 事件\n if (key.length === 1) {\n await dispatchKeyEvent(tabId, 'char', {\n text: key,\n key,\n modifiers: options.modifiers,\n });\n }\n\n await dispatchKeyEvent(tabId, 'keyUp', {\n key,\n code: key,\n windowsVirtualKeyCode: keyCode,\n nativeVirtualKeyCode: keyCode,\n modifiers: options.modifiers,\n });\n}\n\n/**\n * 输入文本(逐字符)\n */\nexport async function insertText(tabId: number, text: string): Promise<void> {\n await sendCommand(tabId, 'Input.insertText', { text });\n}\n\n// ============================================================================\n// Page 域 - 页面操作\n// ============================================================================\n\n/**\n * 截取页面截图\n */\nexport async function captureScreenshot(\n tabId: number,\n options: {\n format?: 'jpeg' | 'png' | 'webp';\n quality?: number;\n clip?: { x: number; y: number; width: number; height: number; scale?: number };\n fromSurface?: boolean;\n captureBeyondViewport?: boolean;\n } = {}\n): Promise<string> {\n const result = await sendCommand<PageCaptureScreenshotResult>(tabId, 'Page.captureScreenshot', {\n format: options.format ?? 'png',\n quality: options.quality,\n clip: options.clip,\n fromSurface: options.fromSurface ?? true,\n captureBeyondViewport: options.captureBeyondViewport ?? false,\n });\n return result.data; // base64 encoded\n}\n\n/**\n * 导航到 URL\n */\nexport async function navigate(tabId: number, url: string): Promise<void> {\n await sendCommand(tabId, 'Page.navigate', { url });\n}\n\n/**\n * 刷新页面\n */\nexport async function reload(tabId: number, ignoreCache = false): Promise<void> {\n await sendCommand(tabId, 'Page.reload', { ignoreCache });\n}\n\n/**\n * 处理 JavaScript 对话框(alert, confirm, prompt)\n */\nexport async function handleJavaScriptDialog(\n tabId: number,\n accept: boolean,\n promptText?: string\n): Promise<void> {\n await sendCommand(tabId, 'Page.handleJavaScriptDialog', {\n accept,\n promptText,\n });\n}\n\n/**\n * 获取待处理的 dialog\n */\nexport function getPendingDialog(tabId: number): DialogInfo | undefined {\n return pendingDialogs.get(tabId);\n}\n\n// ============================================================================\n// Accessibility 域 - 可访问性树\n// ============================================================================\n\n/**\n * 获取完整的可访问性树\n */\nexport async function getFullAccessibilityTree(\n tabId: number,\n options: { depth?: number; frameId?: string } = {}\n): Promise<AXNode[]> {\n // 先启用 Accessibility 域\n await sendCommand(tabId, 'Accessibility.enable');\n \n const result = await sendCommand<AccessibilityGetFullAXTreeResult>(\n tabId,\n 'Accessibility.getFullAXTree',\n {\n depth: options.depth,\n frameId: options.frameId,\n }\n );\n \n return result.nodes;\n}\n\n/**\n * 获取部分可访问性树(从指定节点开始)\n */\nexport async function getPartialAccessibilityTree(\n tabId: number,\n nodeId?: number,\n backendNodeId?: number,\n options: { depth?: number; fetchRelatives?: boolean } = {}\n): Promise<AXNode[]> {\n await sendCommand(tabId, 'Accessibility.enable');\n \n const result = await sendCommand<AccessibilityGetFullAXTreeResult>(\n tabId,\n 'Accessibility.getPartialAXTree',\n {\n nodeId,\n backendNodeId,\n fetchRelatives: options.fetchRelatives ?? true,\n depth: options.depth,\n }\n );\n \n return result.nodes;\n}\n\n// ============================================================================\n// Network 域 - 网络监控和拦截\n// ============================================================================\n\n/**\n * 启用网络监控\n */\nexport async function enableNetwork(tabId: number): Promise<void> {\n if (networkEnabledTabs.has(tabId)) return;\n \n await ensureAttached(tabId);\n await sendCommand(tabId, 'Network.enable');\n await sendCommand(tabId, 'Fetch.enable', {\n patterns: [{ urlPattern: '*' }],\n });\n \n networkEnabledTabs.add(tabId);\n if (!networkRequests.has(tabId)) {\n networkRequests.set(tabId, []);\n }\n \n console.log('[CDPService] Network enabled for tab:', tabId);\n}\n\n/**\n * 禁用网络监控\n */\nexport async function disableNetwork(tabId: number): Promise<void> {\n if (!networkEnabledTabs.has(tabId)) return;\n \n try {\n await sendCommand(tabId, 'Fetch.disable');\n await sendCommand(tabId, 'Network.disable');\n } catch (e) {\n // 忽略错误\n }\n \n networkEnabledTabs.delete(tabId);\n console.log('[CDPService] Network disabled for tab:', tabId);\n}\n\n/**\n * 获取网络请求记录\n */\nexport function getNetworkRequests(tabId: number, filter?: string): NetworkRequest[] {\n const requests = networkRequests.get(tabId) || [];\n if (!filter) return requests;\n \n const lowerFilter = filter.toLowerCase();\n return requests.filter(r => \n r.url.toLowerCase().includes(lowerFilter) ||\n r.method.toLowerCase().includes(lowerFilter) ||\n r.type.toLowerCase().includes(lowerFilter)\n );\n}\n\n/**\n * 清空网络请求记录\n */\nexport function clearNetworkRequests(tabId: number): void {\n networkRequests.set(tabId, []);\n}\n\n/**\n * 添加网络拦截规则\n */\nexport async function addNetworkRoute(\n tabId: number,\n urlPattern: string,\n options: { abort?: boolean; body?: string; status?: number; headers?: Record<string, string> } = {}\n): Promise<void> {\n await enableNetwork(tabId);\n \n const route: NetworkRoute = {\n urlPattern,\n action: options.abort ? 'abort' : (options.body ? 'fulfill' : 'continue'),\n body: options.body,\n status: options.status ?? 200,\n headers: options.headers,\n };\n \n const routes = networkRoutes.get(tabId) || [];\n // 移除同 pattern 的旧规则\n const filtered = routes.filter(r => r.urlPattern !== urlPattern);\n filtered.push(route);\n networkRoutes.set(tabId, filtered);\n \n console.log('[CDPService] Added network route:', route);\n}\n\n/**\n * 移除网络拦截规则\n */\nexport function removeNetworkRoute(tabId: number, urlPattern?: string): void {\n if (!urlPattern) {\n networkRoutes.delete(tabId);\n console.log('[CDPService] Removed all network routes for tab:', tabId);\n } else {\n const routes = networkRoutes.get(tabId) || [];\n networkRoutes.set(tabId, routes.filter(r => r.urlPattern !== urlPattern));\n console.log('[CDPService] Removed network route:', urlPattern);\n }\n}\n\n/**\n * 获取所有网络拦截规则\n */\nexport function getNetworkRoutes(tabId: number): NetworkRoute[] {\n return networkRoutes.get(tabId) || [];\n}\n\n// ============================================================================\n// Console/Runtime 域 - 控制台和错误监控\n// ============================================================================\n\n/**\n * 启用控制台消息监控\n */\nexport async function enableConsole(tabId: number): Promise<void> {\n await ensureAttached(tabId);\n await sendCommand(tabId, 'Runtime.enable');\n await sendCommand(tabId, 'Log.enable');\n \n if (!consoleMessages.has(tabId)) {\n consoleMessages.set(tabId, []);\n }\n if (!jsErrors.has(tabId)) {\n jsErrors.set(tabId, []);\n }\n \n console.log('[CDPService] Console enabled for tab:', tabId);\n}\n\n/**\n * 获取控制台消息\n */\nexport function getConsoleMessages(tabId: number): ConsoleMessage[] {\n return consoleMessages.get(tabId) || [];\n}\n\n/**\n * 清空控制台消息\n */\nexport function clearConsoleMessages(tabId: number): void {\n consoleMessages.set(tabId, []);\n}\n\n/**\n * 获取 JS 错误\n */\nexport function getJSErrors(tabId: number): JSError[] {\n return jsErrors.get(tabId) || [];\n}\n\n/**\n * 清空 JS 错误\n */\nexport function clearJSErrors(tabId: number): void {\n jsErrors.set(tabId, []);\n}\n\n// ============================================================================\n// 事件处理\n// ============================================================================\n\n/**\n * 初始化 CDP 事件监听\n */\nexport function initEventListeners(): void {\n // 监听 debugger 事件\n chrome.debugger.onEvent.addListener((source, method, params) => {\n const tabId = source.tabId;\n if (!tabId) return;\n \n // Dialog 事件\n if (method === 'Page.javascriptDialogOpening') {\n const dialogParams = params as DialogInfo;\n console.log('[CDPService] Dialog opened:', dialogParams);\n pendingDialogs.set(tabId, dialogParams);\n } else if (method === 'Page.javascriptDialogClosed') {\n console.log('[CDPService] Dialog closed');\n pendingDialogs.delete(tabId);\n }\n \n // Network 事件\n else if (method === 'Network.requestWillBeSent') {\n handleNetworkRequest(tabId, params as NetworkRequestParams);\n } else if (method === 'Network.responseReceived') {\n handleNetworkResponse(tabId, params as NetworkResponseParams);\n } else if (method === 'Network.loadingFailed') {\n handleNetworkFailed(tabId, params as NetworkFailedParams);\n }\n \n // Fetch 拦截事件\n else if (method === 'Fetch.requestPaused') {\n handleFetchPaused(tabId, params as FetchPausedParams);\n }\n \n // Console 事件\n else if (method === 'Runtime.consoleAPICalled') {\n handleConsoleAPI(tabId, params as ConsoleAPIParams);\n } else if (method === 'Log.entryAdded') {\n handleLogEntry(tabId, params as LogEntryParams);\n }\n \n // Runtime 异常事件\n else if (method === 'Runtime.exceptionThrown') {\n handleException(tabId, params as ExceptionParams);\n }\n });\n\n // 当 debugger 被 detach 时清理状态\n chrome.debugger.onDetach.addListener((source) => {\n if (source.tabId) {\n cleanupTab(source.tabId);\n console.log('[CDPService] Debugger detached from tab:', source.tabId);\n }\n });\n\n // 当 tab 关闭时清理状态\n chrome.tabs.onRemoved.addListener((tabId) => {\n cleanupTab(tabId);\n });\n}\n\n/**\n * 清理 tab 相关状态\n */\nfunction cleanupTab(tabId: number): void {\n attachedTabs.delete(tabId);\n pendingDialogs.delete(tabId);\n networkRequests.delete(tabId);\n networkRoutes.delete(tabId);\n networkEnabledTabs.delete(tabId);\n consoleMessages.delete(tabId);\n jsErrors.delete(tabId);\n}\n\n// ============================================================================\n// 事件处理函数 - Network\n// ============================================================================\n\ninterface NetworkRequestParams {\n requestId: string;\n request: {\n url: string;\n method: string;\n headers: Record<string, string>;\n postData?: string;\n };\n type: string;\n timestamp: number;\n}\n\ninterface NetworkResponseParams {\n requestId: string;\n response: {\n url: string;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n mimeType: string;\n };\n}\n\ninterface NetworkFailedParams {\n requestId: string;\n errorText: string;\n}\n\ninterface FetchPausedParams {\n requestId: string;\n request: {\n url: string;\n method: string;\n };\n}\n\nfunction handleNetworkRequest(tabId: number, params: NetworkRequestParams): void {\n const requests = networkRequests.get(tabId) || [];\n \n // 限制数量\n if (requests.length >= MAX_REQUESTS) {\n requests.shift();\n }\n \n requests.push({\n requestId: params.requestId,\n url: params.request.url,\n method: params.request.method,\n type: params.type,\n timestamp: params.timestamp * 1000,\n headers: params.request.headers,\n postData: params.request.postData,\n });\n \n networkRequests.set(tabId, requests);\n}\n\nfunction handleNetworkResponse(tabId: number, params: NetworkResponseParams): void {\n const requests = networkRequests.get(tabId) || [];\n const request = requests.find(r => r.requestId === params.requestId);\n \n if (request) {\n request.response = {\n status: params.response.status,\n statusText: params.response.statusText,\n headers: params.response.headers,\n mimeType: params.response.mimeType,\n };\n }\n}\n\nfunction handleNetworkFailed(tabId: number, params: NetworkFailedParams): void {\n const requests = networkRequests.get(tabId) || [];\n const request = requests.find(r => r.requestId === params.requestId);\n \n if (request) {\n request.failed = true;\n request.failureReason = params.errorText;\n }\n}\n\nasync function handleFetchPaused(tabId: number, params: FetchPausedParams): Promise<void> {\n const routes = networkRoutes.get(tabId) || [];\n const url = params.request.url;\n \n // 查找匹配的规则\n const matchedRoute = routes.find(route => {\n if (route.urlPattern === '*') return true;\n if (route.urlPattern.includes('*')) {\n const regex = new RegExp(route.urlPattern.replace(/\\*/g, '.*'));\n return regex.test(url);\n }\n return url.includes(route.urlPattern);\n });\n \n try {\n if (matchedRoute) {\n if (matchedRoute.action === 'abort') {\n await sendCommand(tabId, 'Fetch.failRequest', {\n requestId: params.requestId,\n errorReason: 'BlockedByClient',\n });\n console.log('[CDPService] Blocked request:', url);\n } else if (matchedRoute.action === 'fulfill') {\n await sendCommand(tabId, 'Fetch.fulfillRequest', {\n requestId: params.requestId,\n responseCode: matchedRoute.status || 200,\n responseHeaders: Object.entries(matchedRoute.headers || {}).map(([name, value]) => ({ name, value })),\n body: matchedRoute.body ? btoa(matchedRoute.body) : undefined,\n });\n console.log('[CDPService] Fulfilled request with mock:', url);\n } else {\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n }\n } else {\n // 没有匹配规则,继续请求\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n }\n } catch (error) {\n console.error('[CDPService] Fetch handling error:', error);\n // 出错时尝试继续请求\n try {\n await sendCommand(tabId, 'Fetch.continueRequest', {\n requestId: params.requestId,\n });\n } catch {\n // 忽略\n }\n }\n}\n\n// ============================================================================\n// 事件处理函数 - Console/Runtime\n// ============================================================================\n\ninterface ConsoleAPIParams {\n type: string;\n args: Array<{ type: string; value?: unknown; description?: string }>;\n timestamp: number;\n stackTrace?: { callFrames: Array<{ url: string; lineNumber: number }> };\n}\n\ninterface LogEntryParams {\n entry: {\n level: string;\n text: string;\n timestamp: number;\n url?: string;\n lineNumber?: number;\n };\n}\n\ninterface ExceptionParams {\n exceptionDetails: {\n text: string;\n exception?: { description?: string };\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n stackTrace?: { callFrames: Array<{ url: string; lineNumber: number; columnNumber: number }> };\n };\n timestamp: number;\n}\n\nfunction handleConsoleAPI(tabId: number, params: ConsoleAPIParams): void {\n const messages = consoleMessages.get(tabId) || [];\n \n if (messages.length >= MAX_CONSOLE_MESSAGES) {\n messages.shift();\n }\n \n // 将参数转换为文本\n const text = params.args\n .map(arg => arg.value !== undefined ? String(arg.value) : (arg.description || ''))\n .join(' ');\n \n const typeMap: Record<string, ConsoleMessage['type']> = {\n log: 'log',\n info: 'info',\n warning: 'warn',\n error: 'error',\n debug: 'debug',\n };\n \n messages.push({\n type: typeMap[params.type] || 'log',\n text,\n timestamp: params.timestamp,\n url: params.stackTrace?.callFrames[0]?.url,\n lineNumber: params.stackTrace?.callFrames[0]?.lineNumber,\n });\n \n consoleMessages.set(tabId, messages);\n}\n\nfunction handleLogEntry(tabId: number, params: LogEntryParams): void {\n const messages = consoleMessages.get(tabId) || [];\n \n if (messages.length >= MAX_CONSOLE_MESSAGES) {\n messages.shift();\n }\n \n const typeMap: Record<string, ConsoleMessage['type']> = {\n verbose: 'debug',\n info: 'info',\n warning: 'warn',\n error: 'error',\n };\n \n messages.push({\n type: typeMap[params.entry.level] || 'log',\n text: params.entry.text,\n timestamp: params.entry.timestamp,\n url: params.entry.url,\n lineNumber: params.entry.lineNumber,\n });\n \n consoleMessages.set(tabId, messages);\n}\n\nfunction handleException(tabId: number, params: ExceptionParams): void {\n const errors = jsErrors.get(tabId) || [];\n \n if (errors.length >= MAX_ERRORS) {\n errors.shift();\n }\n \n const details = params.exceptionDetails;\n const stackTrace = details.stackTrace?.callFrames\n .map(f => ` at ${f.url}:${f.lineNumber}:${f.columnNumber}`)\n .join('\\n');\n \n errors.push({\n message: details.exception?.description || details.text,\n url: details.url,\n lineNumber: details.lineNumber,\n columnNumber: details.columnNumber,\n stackTrace,\n timestamp: params.timestamp,\n });\n \n jsErrors.set(tabId, errors);\n}\n\n// ============================================================================\n// 辅助函数\n// ============================================================================\n\n/**\n * 计算元素中心点坐标\n */\nexport function getBoxCenter(box: DOMGetBoxModelResult['model']): { x: number; y: number } {\n // content 是 [x1,y1, x2,y2, x3,y3, x4,y4] 格式的四边形顶点\n const content = box.content;\n const x = (content[0] + content[2] + content[4] + content[6]) / 4;\n const y = (content[1] + content[3] + content[5] + content[7]) / 4;\n return { x, y };\n}\n\n/**\n * 检查 tab 是否已 attach\n */\nexport function isAttached(tabId: number): boolean {\n return attachedTabs.has(tabId);\n}\n","/**\n * DOM Service for bb-browser Extension\n * \n * 封装 buildDomTree 的注入和调用逻辑,将 DOM 树转换为可访问性树文本格式。\n * \n * v2.0: 本文件只保留 snapshot 相关逻辑,其他 DOM 操作已迁移到 cdp-dom-service.ts\n */\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** buildDomTree 返回的原始节点类型 */\ninterface RawDomTextNode {\n type: 'TEXT_NODE';\n text: string;\n isVisible: boolean;\n}\n\ninterface RawDomElementNode {\n tagName: string;\n xpath: string | null;\n attributes: Record<string, string>;\n children: string[];\n isVisible?: boolean;\n isInteractive?: boolean;\n isTopElement?: boolean;\n isInViewport?: boolean;\n highlightIndex?: number;\n shadowRoot?: boolean;\n}\n\ntype RawDomTreeNode = RawDomTextNode | RawDomElementNode;\n\ninterface BuildDomTreeResult {\n rootId: string;\n map: Record<string, RawDomTreeNode>;\n}\n\n/** Ref 元素信息 */\nexport interface RefInfo {\n xpath: string;\n role: string;\n name?: string;\n tagName: string;\n}\n\n/** Snapshot 结果 */\nexport interface SnapshotResult {\n snapshot: string;\n refs: Record<string, RefInfo>;\n}\n\n/** Snapshot 选项 */\nexport interface SnapshotOptions {\n /** 是否只输出可交互元素,默认 false(输出完整树) */\n interactive?: boolean;\n}\n\n/** buildDomTree 的参数 */\ninterface BuildDomTreeArgs {\n showHighlightElements: boolean;\n focusHighlightIndex: number;\n viewportExpansion: number;\n debugMode: boolean;\n startId: number;\n startHighlightIndex: number;\n}\n\ndeclare global {\n interface Window {\n buildDomTree: (args: BuildDomTreeArgs) => BuildDomTreeResult | null;\n }\n}\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 按 tabId 存储每个 tab 的 snapshot refs */\nconst tabSnapshotRefs = new Map<number, Record<string, RefInfo>>();\n\n/** 按 tabId 存储每个 tab 的活动 Frame ID */\nconst tabActiveFrameId = new Map<number, number | null>();\n\n// ============================================================================\n// 公共 API\n// ============================================================================\n\n/**\n * 设置指定 tab 的活动 frame\n */\nexport function setActiveFrameId(tabId: number, frameId: number | null): void {\n tabActiveFrameId.set(tabId, frameId);\n console.log('[DOMService] Active frame changed:', { tabId, frameId: frameId ?? 0 });\n}\n\n/**\n * 获取 ref 对应的信息(在指定 tab 的 refs 中查找)\n */\nexport function getRefInfo(tabId: number, ref: string): RefInfo | null {\n const refId = ref.startsWith('@') ? ref.slice(1) : ref;\n const refs = tabSnapshotRefs.get(tabId) || {};\n return refs[refId] || null;\n}\n\n/**\n * 清理指定 tab 的状态(tab 关闭时调用)\n */\nexport function cleanupTab(tabId: number): void {\n tabSnapshotRefs.delete(tabId);\n tabActiveFrameId.delete(tabId);\n}\n\n/**\n * 获取页面快照\n * @param tabId 目标标签页 ID\n * @param options 快照选项\n * @returns 可访问性树文本和元素引用映射\n */\nexport async function getSnapshot(tabId: number, options: SnapshotOptions = {}): Promise<SnapshotResult> {\n const { interactive = false } = options;\n \n console.log('[DOMService] Getting snapshot for tab:', tabId, { interactive });\n \n // 1. 注入脚本\n await injectBuildDomTreeScript(tabId);\n \n // 2. 执行 buildDomTree\n const domTreeResult = await executeBuildDomTree(tabId);\n \n // 3. 根据模式选择转换方式\n const snapshotResult = interactive \n ? convertToAccessibilityTree(domTreeResult)\n : convertToFullTree(domTreeResult);\n \n // 4. 存储 refs 供后续操作使用(按 tabId 隔离)\n tabSnapshotRefs.set(tabId, snapshotResult.refs);\n \n console.log('[DOMService] Snapshot complete:', {\n mode: interactive ? 'interactive' : 'full',\n linesCount: snapshotResult.snapshot.split('\\n').length,\n refsCount: Object.keys(snapshotResult.refs).length,\n });\n \n return snapshotResult;\n}\n\n// ============================================================================\n// 内部函数 - 脚本注入\n// ============================================================================\n\n/**\n * 获取当前活动 frame 的 target\n */\nfunction getFrameTarget(tabId: number): { tabId: number; frameIds?: number[] } {\n const frameId = tabActiveFrameId.get(tabId) ?? null;\n if (frameId !== null) {\n return { tabId, frameIds: [frameId] };\n }\n return { tabId };\n}\n\n/**\n * 注入 buildDomTree 脚本到目标标签页\n */\nasync function injectBuildDomTreeScript(tabId: number): Promise<void> {\n try {\n const target = getFrameTarget(tabId);\n \n // 检查脚本是否已注入\n const checkResults = await chrome.scripting.executeScript({\n target,\n func: () => Object.prototype.hasOwnProperty.call(window, 'buildDomTree'),\n });\n \n const isInjected = checkResults[0]?.result;\n if (isInjected) {\n return;\n }\n \n // 注入脚本\n await chrome.scripting.executeScript({\n target,\n files: ['buildDomTree.js'],\n });\n } catch (error) {\n console.error('[DOMService] Failed to inject buildDomTree script:', error);\n throw new Error(`Failed to inject script: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * 执行 buildDomTree 并获取 DOM 快照\n */\nasync function executeBuildDomTree(tabId: number): Promise<BuildDomTreeResult> {\n const target = getFrameTarget(tabId);\n \n const results = await chrome.scripting.executeScript({\n target,\n func: (args: BuildDomTreeArgs) => {\n return (window as unknown as { buildDomTree: (args: BuildDomTreeArgs) => BuildDomTreeResult | null }).buildDomTree(args);\n },\n args: [{\n showHighlightElements: true,\n focusHighlightIndex: -1,\n viewportExpansion: -1, // -1 = 全页面模式,不限制视口\n debugMode: false,\n startId: 0,\n startHighlightIndex: 0,\n }],\n });\n \n const result = results[0]?.result as BuildDomTreeResult | null;\n if (!result || !result.map || !result.rootId) {\n throw new Error('Failed to build DOM tree: invalid result structure');\n }\n \n return result;\n}\n\n// ============================================================================\n// 内部函数 - 角色和名称计算\n// ============================================================================\n\n/**\n * 将 tagName 转换为可访问性角色\n */\nfunction getRole(node: RawDomElementNode): string {\n const tagName = node.tagName.toLowerCase();\n const role = node.attributes?.role;\n \n if (role) return role;\n \n const roleMap: Record<string, string> = {\n a: 'link',\n button: 'button',\n input: getInputRole(node),\n select: 'combobox',\n textarea: 'textbox',\n img: 'image',\n nav: 'navigation',\n main: 'main',\n header: 'banner',\n footer: 'contentinfo',\n aside: 'complementary',\n form: 'form',\n table: 'table',\n ul: 'list',\n ol: 'list',\n li: 'listitem',\n h1: 'heading',\n h2: 'heading',\n h3: 'heading',\n h4: 'heading',\n h5: 'heading',\n h6: 'heading',\n dialog: 'dialog',\n article: 'article',\n section: 'region',\n label: 'label',\n details: 'group',\n summary: 'button',\n };\n \n return roleMap[tagName] || tagName;\n}\n\n/**\n * 根据 input type 获取角色\n */\nfunction getInputRole(node: RawDomElementNode): string {\n const type = node.attributes?.type?.toLowerCase() || 'text';\n \n const inputRoleMap: Record<string, string> = {\n text: 'textbox',\n password: 'textbox',\n email: 'textbox',\n url: 'textbox',\n tel: 'textbox',\n search: 'searchbox',\n number: 'spinbutton',\n range: 'slider',\n checkbox: 'checkbox',\n radio: 'radio',\n button: 'button',\n submit: 'button',\n reset: 'button',\n file: 'button',\n };\n \n return inputRoleMap[type] || 'textbox';\n}\n\n/**\n * 获取元素的可访问名称\n */\nfunction getAccessibleName(node: RawDomElementNode, nodeMap: Record<string, RawDomTreeNode>): string | undefined {\n const attrs = node.attributes || {};\n \n if (attrs['aria-label']) return attrs['aria-label'];\n if (attrs.title) return attrs.title;\n if (attrs.placeholder) return attrs.placeholder;\n if (attrs.alt) return attrs.alt;\n if (attrs.value) return attrs.value;\n \n const textContent = collectTextContent(node, nodeMap);\n if (textContent) return textContent;\n \n if (attrs.name) return attrs.name;\n \n return undefined;\n}\n\n/**\n * 收集节点的文本内容\n */\nfunction collectTextContent(\n node: RawDomElementNode, \n nodeMap: Record<string, RawDomTreeNode>, \n maxDepth = 5\n): string {\n const texts: string[] = [];\n \n function collect(nodeId: string, depth: number): void {\n if (depth > maxDepth) return;\n \n const currentNode = nodeMap[nodeId];\n if (!currentNode) return;\n \n if ('type' in currentNode && currentNode.type === 'TEXT_NODE') {\n const text = currentNode.text.trim();\n if (text) texts.push(text);\n return;\n }\n \n const elementNode = currentNode as RawDomElementNode;\n for (const childId of elementNode.children || []) {\n collect(childId, depth + 1);\n }\n }\n \n for (const childId of node.children || []) {\n collect(childId, 0);\n }\n \n return texts.join(' ').trim();\n}\n\n/**\n * 截断文本\n */\nfunction truncateText(text: string, maxLength = 50): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3) + '...';\n}\n\n/**\n * 检查节点 A 是否是节点 B 的祖先\n */\nfunction isAncestor(ancestorId: string, descendantId: string, nodeMap: Record<string, RawDomTreeNode>): boolean {\n const descendant = nodeMap[descendantId];\n if (!descendant || 'type' in descendant) return false;\n \n const ancestor = nodeMap[ancestorId];\n if (!ancestor || 'type' in ancestor) return false;\n \n const ancestorElement = ancestor as RawDomElementNode;\n const elementNode = descendant as RawDomElementNode;\n if (!ancestorElement.xpath || !elementNode.xpath) return false;\n \n return elementNode.xpath.startsWith(ancestorElement.xpath + '/');\n}\n\n// ============================================================================\n// 内部函数 - 树转换\n// ============================================================================\n\n/**\n * 将 DOM 树转换为可访问性树文本格式(只含可交互元素)\n */\nfunction convertToAccessibilityTree(result: BuildDomTreeResult): SnapshotResult {\n const lines: string[] = [];\n const refs: Record<string, RefInfo> = {};\n const { map } = result;\n \n // 收集所有有 highlightIndex 的节点\n const interactiveNodes: Array<{ id: string; node: RawDomElementNode }> = [];\n \n for (const [id, node] of Object.entries(map)) {\n if (!node) continue;\n if ('type' in node && node.type === 'TEXT_NODE') continue;\n \n const elementNode = node as RawDomElementNode;\n if (elementNode.highlightIndex !== undefined && elementNode.highlightIndex !== null) {\n interactiveNodes.push({ id, node: elementNode });\n }\n }\n \n // 按 highlightIndex 排序\n interactiveNodes.sort((a, b) => (a.node.highlightIndex ?? 0) - (b.node.highlightIndex ?? 0));\n \n // 收集所有节点的 name 和 role\n const nodeIdToInfo = new Map<string, { name: string | undefined; role: string }>();\n for (const { id, node } of interactiveNodes) {\n nodeIdToInfo.set(id, { \n name: getAccessibleName(node, map), \n role: getRole(node) \n });\n }\n \n // 过滤冗余节点\n const nonSemanticTags = new Set(['span', 'div', 'i', 'b', 'em', 'strong', 'small', 'svg', 'path', 'g']);\n const filterableTags = new Set(['label']);\n const filteredNodes: Array<{ id: string; node: RawDomElementNode }> = [];\n \n for (const item of interactiveNodes) {\n const { id, node } = item;\n const info = nodeIdToInfo.get(id)!;\n const tagName = node.tagName.toLowerCase();\n \n // 规则1: 过滤没有名称的非语义化元素\n if ((nonSemanticTags.has(tagName) || tagName === 'a') && !info.name) continue;\n \n // 规则2: 过滤 label 元素\n if (filterableTags.has(tagName)) continue;\n \n // 规则3: 过滤可交互元素的非语义化子元素\n let isChildOfInteractive = false;\n for (const otherItem of interactiveNodes) {\n if (otherItem.id === id) continue;\n const otherTagName = otherItem.node.tagName.toLowerCase();\n if (['a', 'button'].includes(otherTagName) && \n nonSemanticTags.has(tagName) && \n isAncestor(otherItem.id, id, map)) {\n isChildOfInteractive = true;\n break;\n }\n }\n if (isChildOfInteractive) continue;\n \n // 规则4: 过滤与祖先同名的节点\n let isDuplicate = false;\n for (const otherItem of interactiveNodes) {\n if (otherItem.id === id) continue;\n const otherInfo = nodeIdToInfo.get(otherItem.id)!;\n if (isAncestor(otherItem.id, id, map) && \n info.name && otherInfo.name && \n info.name === otherInfo.name) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) filteredNodes.push(item);\n }\n \n // 生成输出\n for (const { id, node } of filteredNodes) {\n const refId = String(node.highlightIndex);\n const info = nodeIdToInfo.get(id)!;\n \n let line = `- ${info.role}`;\n if (info.name) line += ` \"${truncateText(info.name)}\"`;\n line += ` [ref=${refId}]`;\n \n lines.push(line);\n refs[refId] = {\n xpath: node.xpath || '',\n role: info.role,\n name: info.name ? truncateText(info.name, 100) : undefined,\n tagName: node.tagName,\n };\n }\n \n return { snapshot: lines.join('\\n'), refs };\n}\n\n/**\n * 将 DOM 树转换为完整树文本格式(包含所有元素和文本节点)\n */\nfunction convertToFullTree(result: BuildDomTreeResult): SnapshotResult {\n const lines: string[] = [];\n const refs: Record<string, RefInfo> = {};\n const { rootId, map } = result;\n \n const skipTags = new Set([\n 'script', 'style', 'noscript', 'svg', 'path', 'g', 'defs', \n 'clippath', 'lineargradient', 'stop', 'symbol', 'use', 'meta', 'link', 'head'\n ]);\n \n function traverse(nodeId: string, depth: number): void {\n const node = map[nodeId];\n if (!node) return;\n \n const indent = ' '.repeat(depth);\n \n // 文本节点\n if ('type' in node && node.type === 'TEXT_NODE') {\n if (!node.isVisible) return;\n const text = node.text.trim();\n if (!text) return;\n const displayText = text.length > 100 ? text.slice(0, 97) + '...' : text;\n lines.push(`${indent}- text: ${displayText}`);\n return;\n }\n \n // 元素节点\n const elementNode = node as RawDomElementNode;\n const tagName = elementNode.tagName.toLowerCase();\n \n if (elementNode.isVisible === false) return;\n if (skipTags.has(tagName)) return;\n \n const role = getRole(elementNode);\n const name = getAccessibleName(elementNode, map);\n const hasRef = elementNode.highlightIndex !== undefined && elementNode.highlightIndex !== null;\n \n let line = `${indent}- ${role}`;\n if (name) {\n const displayName = name.length > 50 ? name.slice(0, 47) + '...' : name;\n line += ` \"${displayName}\"`;\n }\n if (hasRef) {\n const refId = String(elementNode.highlightIndex);\n line += ` [ref=${refId}]`;\n refs[refId] = {\n xpath: elementNode.xpath || '',\n role,\n name: name ? (name.length > 100 ? name.slice(0, 97) + '...' : name) : undefined,\n tagName: elementNode.tagName,\n };\n }\n \n lines.push(line);\n \n for (const childId of elementNode.children || []) {\n traverse(childId, depth + 1);\n }\n }\n \n const rootNode = map[rootId];\n if (rootNode && !('type' in rootNode)) {\n for (const childId of (rootNode as RawDomElementNode).children || []) {\n traverse(childId, 0);\n }\n }\n \n return { snapshot: lines.join('\\n'), refs };\n}\n","/**\n * CDP DOM Service for bb-browser Extension\n * \n * 使用 CDP 协议实现 DOM 操作,替代 Content Script 注入方式。\n * \n * 主要功能:\n * - snapshot: 使用 Runtime.evaluate + buildDomTree(通过 CDP 注入)\n * - click/hover: 使用 DOM.getBoxModel + Input.dispatchMouseEvent\n * - fill/type: 使用 Input.insertText\n * - get text: 使用 Runtime.callFunctionOn\n */\n\nimport * as cdp from './cdp-service';\n// 暂时复用原有的 snapshot 实现(使用 chrome.scripting.executeScript)\nimport { getSnapshot as legacyGetSnapshot, getRefInfo as legacyGetRefInfo, type RefInfo as LegacyRefInfo, type SnapshotResult as LegacySnapshotResult } from './dom-service';\n\n// ============================================================================\n// 类型定义\n// ============================================================================\n\n/** Ref 元素信息 - 使用 xpath 定位(兼容旧实现) */\nexport interface RefInfo {\n xpath: string;\n role: string;\n name?: string;\n tagName?: string;\n}\n\n/** Snapshot 结果 */\nexport interface SnapshotResult {\n snapshot: string;\n refs: Record<string, RefInfo>;\n}\n\n/** Snapshot 选项 */\nexport interface SnapshotOptions {\n /** 是否只输出可交互元素,默认 false */\n interactive?: boolean;\n}\n\n// ============================================================================\n// 状态管理(使用 chrome.storage.session 持久化,防止 Service Worker 休眠丢失)\n// ============================================================================\n\n/** 按 tabId 存储每个 tab 的 snapshot refs(内存缓存) */\nconst tabSnapshotRefs = new Map<number, Record<string, RefInfo>>();\n\n/** 按 tabId 存储每个 tab 的活动 Frame ID */\nconst tabActiveFrameId = new Map<number, string | null>();\n\n/** 从 storage 恢复所有 tab 的 refs(Service Worker 唤醒时调用) */\nasync function loadRefsFromStorage(): Promise<void> {\n try {\n const result = await chrome.storage.session.get('tabSnapshotRefs');\n if (result.tabSnapshotRefs) {\n const stored = result.tabSnapshotRefs as Record<string, Record<string, RefInfo>>;\n for (const [tabIdStr, refs] of Object.entries(stored)) {\n tabSnapshotRefs.set(Number(tabIdStr), refs);\n }\n console.log('[CDPDOMService] Loaded refs from storage:', tabSnapshotRefs.size, 'tabs');\n }\n } catch (e) {\n console.warn('[CDPDOMService] Failed to load refs from storage:', e);\n }\n}\n\n/** 保存指定 tab 的 refs 到 storage */\nasync function saveRefsToStorage(tabId: number, refs: Record<string, RefInfo>): Promise<void> {\n try {\n // 读取现有的,更新指定 tab,写回\n const result = await chrome.storage.session.get('tabSnapshotRefs');\n const stored = (result.tabSnapshotRefs || {}) as Record<string, Record<string, RefInfo>>;\n stored[String(tabId)] = refs;\n await chrome.storage.session.set({ tabSnapshotRefs: stored });\n console.log('[CDPDOMService] Saved refs to storage for tab:', tabId, Object.keys(refs).length);\n } catch (e) {\n console.warn('[CDPDOMService] Failed to save refs to storage:', e);\n }\n}\n\n// Service Worker 启动时恢复 refs\nloadRefsFromStorage();\n\n// ============================================================================\n// Snapshot 实现\n// ============================================================================\n\n/**\n * 获取页面快照\n * 暂时使用旧的实现(chrome.scripting.executeScript + buildDomTree)\n * TODO: 后续迁移到纯 CDP 实现(Accessibility.getFullAXTree 或 Runtime.evaluate)\n */\nexport async function getSnapshot(\n tabId: number,\n options: SnapshotOptions = {}\n): Promise<SnapshotResult> {\n console.log('[CDPDOMService] Getting snapshot via legacy method for tab:', tabId);\n \n // 使用旧的实现\n const result = await legacyGetSnapshot(tabId, options);\n \n // 转换 refs 格式(添加 xpath 兼容)\n const convertedRefs: Record<string, RefInfo> = {};\n for (const [refId, refInfo] of Object.entries(result.refs)) {\n convertedRefs[refId] = {\n xpath: refInfo.xpath,\n role: refInfo.role,\n name: refInfo.name,\n tagName: refInfo.tagName,\n };\n }\n \n // 保存 refs 供后续操作使用(按 tabId 隔离,内存 + storage)\n tabSnapshotRefs.set(tabId, convertedRefs);\n await saveRefsToStorage(tabId, convertedRefs);\n \n console.log('[CDPDOMService] Snapshot complete:', {\n linesCount: result.snapshot.split('\\n').length,\n refsCount: Object.keys(convertedRefs).length,\n });\n \n return {\n snapshot: result.snapshot,\n refs: convertedRefs,\n };\n}\n\n// ============================================================================\n// DOM 操作\n// ============================================================================\n\n/**\n * 获取 ref 对应的信息(在指定 tab 的 refs 中查找)\n * 优先从内存缓存读取,如果没有则尝试从 storage 恢复\n */\nexport async function getRefInfo(tabId: number, ref: string): Promise<RefInfo | null> {\n const refId = ref.startsWith('@') ? ref.slice(1) : ref;\n \n // 先检查内存缓存\n const refs = tabSnapshotRefs.get(tabId);\n if (refs?.[refId]) {\n return refs[refId];\n }\n \n // 内存中没有,尝试从 storage 恢复\n if (!tabSnapshotRefs.has(tabId)) {\n await loadRefsFromStorage();\n const loaded = tabSnapshotRefs.get(tabId);\n if (loaded?.[refId]) {\n return loaded[refId];\n }\n }\n \n return null;\n}\n\n/**\n * 清理指定 tab 的状态(tab 关闭时调用)\n */\nexport function cleanupTab(tabId: number): void {\n tabSnapshotRefs.delete(tabId);\n tabActiveFrameId.delete(tabId);\n}\n\n/**\n * 通过 xpath 获取元素的 nodeId 和 backendNodeId\n */\nasync function getNodeByXPath(\n tabId: number,\n xpath: string\n): Promise<{ nodeId: number; backendNodeId: number }> {\n // 先获取文档根节点\n const doc = await cdp.getDocument(tabId, { depth: 0 });\n \n // 使用 DOM.performSearch 或 Runtime.evaluate 来查找 xpath\n // CDP 没有直接的 xpath 查询,我们用 Runtime.evaluate\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return null;\n \n // 返回元素的一些信息供调试\n const rect = element.getBoundingClientRect();\n return {\n found: true,\n tagName: element.tagName,\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n width: rect.width,\n height: rect.height,\n };\n })()\n `, { returnByValue: true });\n \n if (!result || !(result as { found?: boolean }).found) {\n throw new Error(`Element not found by xpath: ${xpath}`);\n }\n \n return result as { nodeId: number; backendNodeId: number; x: number; y: number };\n}\n\n/**\n * 通过 xpath 获取元素的中心坐标\n */\nasync function getElementCenterByXPath(\n tabId: number,\n xpath: string\n): Promise<{ x: number; y: number }> {\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return null;\n \n // 滚动到可见\n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n \n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n })()\n `, { returnByValue: true });\n \n if (!result) {\n throw new Error(`Element not found by xpath: ${xpath}`);\n }\n \n return result as { x: number; y: number };\n}\n\n/**\n * 点击元素\n * 使用 CDP Runtime.evaluate 定位 + Input.dispatchMouseEvent 点击\n */\nexport async function clickElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 获取元素中心坐标(同时滚动到可见)\n const { x, y } = await getElementCenterByXPath(tabId, xpath);\n\n // 使用 CDP 点击\n await cdp.click(tabId, x, y);\n\n console.log('[CDPDOMService] Clicked element:', { ref, role, name, x, y });\n return { role, name };\n}\n\n/**\n * 悬停在元素上\n * 使用 CDP Runtime.evaluate 定位 + Input.dispatchMouseEvent 悬停\n */\nexport async function hoverElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 获取元素中心坐标(同时滚动到可见)\n const { x, y } = await getElementCenterByXPath(tabId, xpath);\n\n // 使用 CDP 移动鼠标\n await cdp.moveMouse(tabId, x, y);\n\n console.log('[CDPDOMService] Hovered element:', { ref, role, name, x, y });\n return { role, name };\n}\n\n/**\n * 填充输入框(清空后输入)\n * 使用 CDP Runtime.evaluate 聚焦 + Input.insertText 输入\n */\nexport async function fillElement(\n tabId: number,\n ref: string,\n text: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 滚动到可见并聚焦\n await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n \n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n element.focus();\n \n // 清空内容\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {\n element.value = '';\n } else if (element.isContentEditable) {\n element.textContent = '';\n }\n })()\n `);\n\n // 输入文本\n await cdp.insertText(tabId, text);\n\n console.log('[CDPDOMService] Filled element:', { ref, role, name, textLength: text.length });\n return { role, name };\n}\n\n/**\n * 逐字符输入文本(不清空)\n * 使用 CDP Runtime.evaluate 聚焦 + Input.dispatchKeyEvent 输入\n */\nexport async function typeElement(\n tabId: number,\n ref: string,\n text: string\n): Promise<{ role: string; name?: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n // 滚动到可见并聚焦\n await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n \n element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });\n element.focus();\n })()\n `);\n\n // 逐字符输入\n for (const char of text) {\n await cdp.pressKey(tabId, char);\n }\n\n console.log('[CDPDOMService] Typed in element:', { ref, role, name, textLength: text.length });\n return { role, name };\n}\n\n/**\n * 获取元素文本内容\n * 使用 CDP Runtime.evaluate\n */\nexport async function getElementText(tabId: number, ref: string): Promise<string> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath } = refInfo;\n\n const text = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) return '';\n return (element.textContent || '').trim();\n })()\n `);\n\n console.log('[CDPDOMService] Got element text:', { ref, textLength: (text as string).length });\n return text as string;\n}\n\n/**\n * 勾选复选框\n * 使用 CDP Runtime.evaluate\n */\nexport async function checkElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string; wasAlreadyChecked: boolean }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.type !== 'checkbox' && element.type !== 'radio') {\n throw new Error('Element is not a checkbox or radio');\n }\n const wasChecked = element.checked;\n if (!wasChecked) {\n element.checked = true;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n return wasChecked;\n })()\n `);\n\n console.log('[CDPDOMService] Checked element:', { ref, role, name, wasAlreadyChecked: result });\n return { role, name, wasAlreadyChecked: result as boolean };\n}\n\n/**\n * 取消勾选复选框\n * 使用 CDP Runtime.evaluate\n */\nexport async function uncheckElement(\n tabId: number,\n ref: string\n): Promise<{ role: string; name?: string; wasAlreadyUnchecked: boolean }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.type !== 'checkbox' && element.type !== 'radio') {\n throw new Error('Element is not a checkbox or radio');\n }\n const wasUnchecked = !element.checked;\n if (!wasUnchecked) {\n element.checked = false;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n return wasUnchecked;\n })()\n `);\n\n console.log('[CDPDOMService] Unchecked element:', { ref, role, name, wasAlreadyUnchecked: result });\n return { role, name, wasAlreadyUnchecked: result as boolean };\n}\n\n/**\n * 选择下拉框选项\n * 使用 CDP Runtime.evaluate\n */\nexport async function selectOption(\n tabId: number,\n ref: string,\n value: string\n): Promise<{ role: string; name?: string; selectedValue: string; selectedLabel: string }> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath, role, name } = refInfo;\n\n const result = await cdp.evaluate(tabId, `\n (function() {\n const selectValue = ${JSON.stringify(value)};\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n const element = result.singleNodeValue;\n if (!element) throw new Error('Element not found');\n if (element.tagName !== 'SELECT') {\n throw new Error('Element is not a <select> element');\n }\n \n // 尝试通过 value 或 text 匹配\n let matched = null;\n for (const opt of element.options) {\n if (opt.value === selectValue || opt.textContent.trim() === selectValue) {\n matched = opt;\n break;\n }\n }\n \n // 不区分大小写匹配\n if (!matched) {\n const lower = selectValue.toLowerCase();\n for (const opt of element.options) {\n if (opt.value.toLowerCase() === lower || opt.textContent.trim().toLowerCase() === lower) {\n matched = opt;\n break;\n }\n }\n }\n \n if (!matched) {\n const available = Array.from(element.options).map(o => ({ value: o.value, label: o.textContent.trim() }));\n throw new Error('Option not found: ' + selectValue + '. Available: ' + JSON.stringify(available));\n }\n \n element.value = matched.value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n \n return { selectedValue: matched.value, selectedLabel: matched.textContent.trim() };\n })()\n `);\n\n const { selectedValue, selectedLabel } = result as { selectedValue: string; selectedLabel: string };\n console.log('[CDPDOMService] Selected option:', { ref, role, name, selectedValue });\n return { role, name, selectedValue, selectedLabel };\n}\n\n/**\n * 等待元素出现\n * 使用 CDP Runtime.evaluate 检查元素是否存在\n */\nexport async function waitForElement(\n tabId: number,\n ref: string,\n maxWait = 10000,\n interval = 200\n): Promise<void> {\n const refInfo = await getRefInfo(tabId, ref);\n if (!refInfo) {\n throw new Error(`Ref \"${ref}\" not found. Run snapshot first to get available refs.`);\n }\n\n const { xpath } = refInfo;\n let elapsed = 0;\n\n while (elapsed < maxWait) {\n const found = await cdp.evaluate(tabId, `\n (function() {\n const result = document.evaluate(\n ${JSON.stringify(xpath)},\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue !== null;\n })()\n `);\n\n if (found) {\n console.log('[CDPDOMService] Element found:', { ref, elapsed });\n return;\n }\n\n await new Promise(resolve => setTimeout(resolve, interval));\n elapsed += interval;\n }\n\n throw new Error(`Timeout waiting for element @${ref} after ${maxWait}ms`);\n}\n\n// ============================================================================\n// Frame 管理\n// ============================================================================\n\n/**\n * 设置指定 tab 的活动 frame\n */\nexport function setActiveFrameId(tabId: number, frameId: string | null): void {\n tabActiveFrameId.set(tabId, frameId);\n console.log('[CDPDOMService] Active frame changed:', { tabId, frameId: frameId ?? 'main' });\n}\n\n/**\n * 获取指定 tab 的活动 frame\n */\nexport function getActiveFrameId(tabId: number): string | null {\n return tabActiveFrameId.get(tabId) ?? null;\n}\n\n// ============================================================================\n// 输入操作\n// ============================================================================\n\n/**\n * 发送键盘按键\n */\nexport async function pressKey(\n tabId: number,\n key: string,\n modifiers: string[] = []\n): Promise<void> {\n // 计算 modifiers 位掩码\n let modifierFlags = 0;\n if (modifiers.includes('Alt')) modifierFlags |= 1;\n if (modifiers.includes('Control')) modifierFlags |= 2;\n if (modifiers.includes('Meta')) modifierFlags |= 4;\n if (modifiers.includes('Shift')) modifierFlags |= 8;\n\n await cdp.pressKey(tabId, key, { modifiers: modifierFlags });\n console.log('[CDPDOMService] Pressed key:', key, modifiers);\n}\n\n/**\n * 滚动页面\n */\nexport async function scrollPage(\n tabId: number,\n direction: 'up' | 'down' | 'left' | 'right',\n pixels: number\n): Promise<void> {\n // 获取页面尺寸以确定滚动位置\n const result = await cdp.evaluate(\n tabId,\n 'JSON.stringify({ width: window.innerWidth, height: window.innerHeight })'\n );\n const { width, height } = JSON.parse(result as string);\n \n // 在页面中心位置滚动\n const x = width / 2;\n const y = height / 2;\n \n let deltaX = 0;\n let deltaY = 0;\n \n switch (direction) {\n case 'up': deltaY = -pixels; break;\n case 'down': deltaY = pixels; break;\n case 'left': deltaX = -pixels; break;\n case 'right': deltaX = pixels; break;\n }\n\n await cdp.scroll(tabId, x, y, deltaX, deltaY);\n console.log('[CDPDOMService] Scrolled:', { direction, pixels });\n}\n","/**\n * Trace Service\n * \n * Background 中的 trace 状态管理\n * 负责:\n * - 管理录制状态\n * - 存储录制的事件\n * - 与 content script 通信\n */\n\nimport type { TraceEvent, TraceStatus } from '@anthropic/bb-browser-shared';\n\n// ============================================================================\n// 状态管理\n// ============================================================================\n\n/** 是否正在录制 */\nlet isRecording = false;\n\n/** 录制的标签页 ID */\nlet recordingTabId: number | null = null;\n\n/** 录制的事件列表 */\nlet events: TraceEvent[] = [];\n\n// ============================================================================\n// 公共 API\n// ============================================================================\n\n/**\n * 开始录制\n */\nexport async function startRecording(tabId: number): Promise<void> {\n console.log('[TraceService] Starting recording on tab:', tabId);\n \n isRecording = true;\n recordingTabId = tabId;\n events = [];\n \n // 添加页面导航事件作为第一个事件\n try {\n const tab = await chrome.tabs.get(tabId);\n if (tab.url) {\n events.push({\n type: 'navigation',\n timestamp: Date.now(),\n url: tab.url,\n elementRole: 'document',\n elementName: tab.title || '',\n elementTag: 'document',\n });\n }\n } catch (error) {\n console.error('[TraceService] Error getting tab info:', error);\n }\n \n // 通知 content script 开始录制\n try {\n await chrome.tabs.sendMessage(tabId, { type: 'TRACE_START' });\n } catch (error) {\n // Content script 可能尚未加载,注入它\n console.log('[TraceService] Content script not ready, will record on next event');\n }\n}\n\n/**\n * 停止录制\n */\nexport async function stopRecording(): Promise<TraceEvent[]> {\n console.log('[TraceService] Stopping recording, events:', events.length);\n \n const recordedEvents = [...events];\n \n // 通知 content script 停止录制\n if (recordingTabId !== null) {\n try {\n await chrome.tabs.sendMessage(recordingTabId, { type: 'TRACE_STOP' });\n } catch (error) {\n // Content script 可能已关闭\n console.log('[TraceService] Could not notify content script:', error);\n }\n }\n \n isRecording = false;\n recordingTabId = null;\n events = [];\n \n return recordedEvents;\n}\n\n/**\n * 获取录制状态\n */\nexport function getStatus(): TraceStatus {\n return {\n recording: isRecording,\n eventCount: events.length,\n tabId: recordingTabId ?? undefined,\n };\n}\n\n/**\n * 添加事件\n */\nexport function addEvent(event: TraceEvent): void {\n if (!isRecording) return;\n \n console.log('[TraceService] Adding event:', event.type, event);\n events.push(event);\n}\n\n/**\n * 检查是否正在录制\n */\nexport function isCurrentlyRecording(): boolean {\n return isRecording;\n}\n\n/**\n * 获取录制的标签页 ID\n */\nexport function getRecordingTabId(): number | null {\n return recordingTabId;\n}\n\n// ============================================================================\n// 消息监听\n// ============================================================================\n\n// 监听来自 content script 的消息\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n // 处理 trace 事件\n if (message.type === 'TRACE_EVENT') {\n if (isRecording && sender.tab?.id === recordingTabId) {\n addEvent(message.payload as TraceEvent);\n }\n sendResponse({ received: true });\n return true;\n }\n \n // 处理 content script 请求录制状态\n if (message.type === 'GET_TRACE_STATUS') {\n sendResponse({\n recording: isRecording && sender.tab?.id === recordingTabId,\n tabId: recordingTabId,\n });\n return true;\n }\n \n return false;\n});\n\n// 监听标签页关闭事件\nchrome.tabs.onRemoved.addListener((tabId) => {\n if (tabId === recordingTabId) {\n console.log('[TraceService] Recording tab closed, stopping recording');\n isRecording = false;\n recordingTabId = null;\n // 不清空 events,以便用户可以恢复\n }\n});\n\n// 监听标签页导航事件\nchrome.tabs.onUpdated.addListener(async (tabId, changeInfo, _tab) => {\n if (tabId === recordingTabId && isRecording) {\n // 记录导航事件\n if (changeInfo.url) {\n events.push({\n type: 'navigation',\n timestamp: Date.now(),\n url: changeInfo.url,\n elementRole: 'document',\n elementName: _tab.title || '',\n elementTag: 'document',\n });\n console.log('[TraceService] Navigation event:', changeInfo.url);\n }\n \n // 页面加载完成后,通知 content script 开始录制\n if (changeInfo.status === 'complete') {\n console.log('[TraceService] Page loaded, notifying content script to start recording');\n try {\n await chrome.tabs.sendMessage(tabId, { type: 'TRACE_START' });\n } catch (error) {\n console.log('[TraceService] Could not notify content script:', error);\n }\n }\n }\n});\n\nconsole.log('[TraceService] Initialized');\n","/**\n * Command Handler for bb-browser Extension\n * 处理从 Daemon 接收的命令\n * \n * v2.0: 使用 CDP (chrome.debugger) 实现所有 DOM 操作\n */\n\nimport { sendResult, CommandResult } from './api-client';\nimport { CommandEvent } from './sse-client';\nimport * as cdp from './cdp-service';\nimport * as cdpDom from './cdp-dom-service';\nimport { cleanupTab as cleanupCdpTab } from './cdp-dom-service';\nimport { cleanupTab as cleanupDomTab } from './dom-service';\nimport * as traceService from './trace-service';\n\n// 初始化 CDP 事件监听器\ncdp.initEventListeners();\n\n/**\n * 每个 tab 的活动 Frame 的 frameId\n * null 表示主 frame,数字表示子 frame 的 frameId\n * 用于 handleFrame 内部逻辑,DOM 操作使用 dom-service 的 activeFrameId\n */\nconst tabActiveFrameId = new Map<number, number | null>();\n\n/**\n * 根据命令解析目标 tab\n * 如果 command.tabId 是 number,用它直接获取 tab\n * 否则 fallback 到当前活跃 tab\n */\nasync function resolveTab(command: CommandEvent): Promise<chrome.tabs.Tab> {\n if (command.tabId !== undefined && typeof command.tabId === 'number') {\n return chrome.tabs.get(command.tabId);\n }\n const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });\n if (!tab?.id) {\n throw new Error('No active tab found');\n }\n return tab;\n}\n\n/**\n * 处理收到的命令\n */\nexport async function handleCommand(command: CommandEvent): Promise<void> {\n console.log('[CommandHandler] Processing command:', command.id, command.action);\n\n let result: CommandResult;\n\n try {\n switch (command.action) {\n case 'open':\n result = await handleOpen(command);\n break;\n\n case 'snapshot':\n result = await handleSnapshot(command);\n break;\n\n case 'click':\n result = await handleClick(command);\n break;\n\n case 'hover':\n result = await handleHover(command);\n break;\n\n case 'fill':\n result = await handleFill(command);\n break;\n\n case 'type':\n result = await handleType(command);\n break;\n\n case 'check':\n result = await handleCheck(command);\n break;\n\n case 'uncheck':\n result = await handleUncheck(command);\n break;\n\n case 'close':\n result = await handleClose(command);\n break;\n\n case 'get':\n result = await handleGet(command);\n break;\n\n case 'screenshot':\n result = await handleScreenshot(command);\n break;\n\n case 'wait':\n result = await handleWait(command);\n break;\n\n case 'press':\n result = await handlePress(command);\n break;\n\n case 'scroll':\n result = await handleScroll(command);\n break;\n\n case 'back':\n result = await handleBack(command);\n break;\n\n case 'forward':\n result = await handleForward(command);\n break;\n\n case 'refresh':\n result = await handleRefresh(command);\n break;\n\n case 'eval':\n result = await handleEval(command);\n break;\n\n case 'select':\n result = await handleSelect(command);\n break;\n\n case 'tab_list':\n result = await handleTabList(command);\n break;\n\n case 'tab_new':\n result = await handleTabNew(command);\n break;\n\n case 'tab_select':\n result = await handleTabSelect(command);\n break;\n\n case 'tab_close':\n result = await handleTabClose(command);\n break;\n\n case 'frame':\n result = await handleFrame(command);\n break;\n\n case 'frame_main':\n result = await handleFrameMain(command);\n break;\n\n case 'dialog':\n result = await handleDialog(command);\n break;\n\n case 'network':\n result = await handleNetwork(command);\n break;\n\n case 'console':\n result = await handleConsole(command);\n break;\n\n case 'errors':\n result = await handleErrors(command);\n break;\n\n case 'trace':\n result = await handleTrace(command);\n break;\n\n default:\n result = {\n id: command.id,\n success: false,\n error: `Unknown action: ${command.action}`,\n };\n }\n } catch (error) {\n result = {\n id: command.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n\n await sendResult(result);\n}\n\n/**\n * 处理 open 命令 - 打开 URL\n * \n * 参数:\n * - url: 要打开的 URL\n * - tabId: 可选,指定在哪个 tab 中打开\n * - undefined: 创建新 tab(默认,并发安全)\n * - \"current\": 在当前活动 tab 中导航\n * - number: 在指定 tabId 的 tab 中导航\n */\nasync function handleOpen(command: CommandEvent): Promise<CommandResult> {\n const url = command.url as string;\n const tabIdParam = command.tabId as string | number | undefined;\n\n if (!url) {\n return {\n id: command.id,\n success: false,\n error: 'Missing url parameter',\n };\n }\n\n console.log('[CommandHandler] Opening URL:', url, 'tabId:', tabIdParam);\n\n let tab: chrome.tabs.Tab;\n\n if (tabIdParam === undefined) {\n // 默认行为:创建新 tab(并发安全)\n tab = await chrome.tabs.create({ url, active: true });\n } else if (tabIdParam === \"current\") {\n // 在当前活动 tab 中导航\n const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true });\n \n if (activeTab && activeTab.id) {\n tab = await chrome.tabs.update(activeTab.id, { url });\n } else {\n // 没有活动 tab,创建新的\n tab = await chrome.tabs.create({ url, active: true });\n }\n } else {\n // 在指定 tabId 的 tab 中导航\n const targetTabId = typeof tabIdParam === 'number' ? tabIdParam : parseInt(String(tabIdParam), 10);\n \n if (isNaN(targetTabId)) {\n return {\n id: command.id,\n success: false,\n error: `Invalid tabId: ${tabIdParam}`,\n };\n }\n\n try {\n tab = await chrome.tabs.update(targetTabId, { url, active: true });\n } catch (error) {\n return {\n id: command.id,\n success: false,\n error: `Tab ${targetTabId} not found or cannot be updated`,\n };\n }\n }\n\n // 等待页面加载完成\n await waitForTabLoad(tab.id!);\n\n // 获取页面信息\n const updatedTab = await chrome.tabs.get(tab.id!);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: tab.id,\n title: updatedTab.title || '',\n url: updatedTab.url || url,\n },\n };\n}\n\n/**\n * 处理 snapshot 命令 - 获取页面快照\n * v2.0: 使用 CDP Accessibility.getFullAXTree 获取可访问性树\n */\nasync function handleSnapshot(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面(chrome:// 或 about:)\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot take snapshot of restricted page: ${url}`,\n };\n }\n\n // 获取 interactive 参数,默认 false(完整树模式)\n const interactive = command.interactive as boolean | undefined;\n\n console.log('[CommandHandler] Taking snapshot of tab:', activeTab.id, activeTab.url, { interactive });\n\n try {\n // v2.0: 使用 CDP DOM Service 获取快照\n const snapshotResult = await cdpDom.getSnapshot(activeTab.id, { interactive });\n\n return {\n id: command.id,\n success: true,\n data: {\n title: activeTab.title || '',\n url: activeTab.url || '',\n snapshotData: snapshotResult,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Snapshot failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Snapshot failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 click 命令 - 点击元素\n * v2.0: 使用 CDP Input.dispatchMouseEvent\n */\nasync function handleClick(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Clicking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.clickElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Click failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Click failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 hover 命令 - 悬停在元素上\n * v2.0: 使用 CDP Input.dispatchMouseEvent\n */\nasync function handleHover(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Hovering element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.hoverElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Hover failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Hover failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 fill 命令 - 填充输入框\n */\nasync function handleFill(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const text = command.text as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (text === undefined || text === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing text parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Filling element:', ref, 'with text length:', text.length);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.fillElement(activeTab.id, ref, text);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n filledText: text,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Fill failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Fill failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 type 命令 - 逐字符输入文本(不清空原有内容)\n * v2.0: 使用 CDP Input.dispatchKeyEvent\n */\nasync function handleType(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const text = command.text as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (text === undefined || text === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing text parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Typing in element:', ref, 'text length:', text.length);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.typeElement(activeTab.id, ref, text);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n typedText: text,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Type failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Type failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 check 命令 - 勾选复选框\n */\nasync function handleCheck(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Checking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.checkElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n wasAlreadyChecked: elementInfo.wasAlreadyChecked,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Check failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Check failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 uncheck 命令 - 取消勾选复选框\n * v2.0: 使用 CDP Runtime.callFunctionOn\n */\nasync function handleUncheck(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Unchecking element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const elementInfo = await cdpDom.uncheckElement(activeTab.id, ref);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: elementInfo.role,\n name: elementInfo.name,\n wasAlreadyUnchecked: elementInfo.wasAlreadyUnchecked,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Uncheck failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Uncheck failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 select 命令 - 下拉框选择\n * v2.0: 使用 CDP Runtime.callFunctionOn\n */\nasync function handleSelect(command: CommandEvent): Promise<CommandResult> {\n const ref = command.ref as string;\n const value = command.value as string;\n\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n if (value === undefined || value === null) {\n return {\n id: command.id,\n success: false,\n error: 'Missing value parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Selecting option:', ref, 'value:', value);\n\n try {\n // v2.0: 使用 CDP DOM Service\n const result = await cdpDom.selectOption(activeTab.id, ref, value);\n\n return {\n id: command.id,\n success: true,\n data: {\n role: result.role,\n name: result.name,\n selectedValue: result.selectedValue,\n selectedLabel: result.selectedLabel,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Select failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Select failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 close 命令 - 关闭当前标签页\n */\nasync function handleClose(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const title = activeTab.title || '';\n const url = activeTab.url || '';\n\n console.log('[CommandHandler] Closing tab:', tabId, url);\n\n try {\n await chrome.tabs.remove(tabId);\n\n // 清理 tab 相关状态\n cleanupDomTab(tabId);\n cleanupCdpTab(tabId);\n tabActiveFrameId.delete(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId,\n title,\n url,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Close failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Close failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 get 命令 - 获取页面或元素信息\n */\nasync function handleGet(command: CommandEvent): Promise<CommandResult> {\n const attribute = command.attribute as string;\n\n if (!attribute) {\n return {\n id: command.id,\n success: false,\n error: 'Missing attribute parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Getting:', attribute);\n\n try {\n let value: string;\n\n switch (attribute) {\n case 'url':\n value = activeTab.url || '';\n break;\n\n case 'title':\n value = activeTab.title || '';\n break;\n\n case 'text': {\n const ref = command.ref as string;\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter for get text',\n };\n }\n // v2.0: 使用 CDP DOM Service\n value = await cdpDom.getElementText(activeTab.id, ref);\n break;\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown attribute: ${attribute}`,\n };\n }\n\n return {\n id: command.id,\n success: true,\n data: {\n value,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Get failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Get failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 screenshot 命令 - 截取当前页面\n */\nasync function handleScreenshot(command: CommandEvent): Promise<CommandResult> {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id || !activeTab.windowId) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Taking screenshot of tab:', activeTab.id, activeTab.url);\n\n try {\n // 使用 chrome.tabs.captureVisibleTab 截图\n const dataUrl = await chrome.tabs.captureVisibleTab(activeTab.windowId, { format: 'png' });\n\n return {\n id: command.id,\n success: true,\n data: {\n dataUrl,\n title: activeTab.title || '',\n url: activeTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Screenshot failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Screenshot failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 wait 命令 - 等待时间或元素\n */\nasync function handleWait(command: CommandEvent): Promise<CommandResult> {\n const waitType = command.waitType as string;\n\n if (waitType === 'time') {\n // 等待指定时间\n const ms = command.ms as number;\n if (!ms || ms < 0) {\n return {\n id: command.id,\n success: false,\n error: 'Invalid ms parameter',\n };\n }\n\n console.log('[CommandHandler] Waiting for', ms, 'ms');\n await new Promise(resolve => setTimeout(resolve, ms));\n\n return {\n id: command.id,\n success: true,\n data: { waited: ms },\n };\n } else if (waitType === 'element') {\n // 等待元素出现\n const ref = command.ref as string;\n if (!ref) {\n return {\n id: command.id,\n success: false,\n error: 'Missing ref parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Waiting for element:', ref);\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.waitForElement(activeTab.id, ref);\n return {\n id: command.id,\n success: true,\n data: { ref },\n };\n } catch (error) {\n console.error('[CommandHandler] Wait failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Wait failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n } else {\n return {\n id: command.id,\n success: false,\n error: `Unknown wait type: ${waitType}`,\n };\n }\n}\n\n/**\n * 处理 press 命令 - 发送键盘按键\n */\nasync function handlePress(command: CommandEvent): Promise<CommandResult> {\n const key = command.key as string;\n const modifiers = (command.modifiers as string[]) || [];\n\n if (!key) {\n return {\n id: command.id,\n success: false,\n error: 'Missing key parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot send keys to restricted page: ${url}`,\n };\n }\n\n console.log('[CommandHandler] Pressing key:', key, 'modifiers:', modifiers);\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.pressKey(activeTab.id, key, modifiers);\n\n const displayKey = modifiers.length > 0 ? `${modifiers.join('+')}+${key}` : key;\n\n return {\n id: command.id,\n success: true,\n data: {\n key: displayKey,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Press failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Press failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 scroll 命令 - 滚动页面\n * v2.0: 使用 CDP Input.dispatchMouseEvent (wheel)\n */\nasync function handleScroll(command: CommandEvent): Promise<CommandResult> {\n const direction = command.direction as string;\n const pixels = (command.pixels as number) || 300;\n\n if (!direction) {\n return {\n id: command.id,\n success: false,\n error: 'Missing direction parameter',\n };\n }\n\n if (!['up', 'down', 'left', 'right'].includes(direction)) {\n return {\n id: command.id,\n success: false,\n error: `Invalid direction: ${direction}`,\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Scrolling:', direction, pixels, 'px');\n\n try {\n // v2.0: 使用 CDP DOM Service\n await cdpDom.scrollPage(activeTab.id, direction as 'up' | 'down' | 'left' | 'right', pixels);\n\n return {\n id: command.id,\n success: true,\n data: {\n direction,\n pixels,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Scroll failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Scroll failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 back 命令 - 后退\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleBack(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n console.log('[CommandHandler] Going back in tab:', tabId);\n\n try {\n // v2.0: 使用 CDP Service\n // 先检查是否可以后退\n const canGoBack = await cdp.evaluate(tabId, 'window.history.length > 1');\n \n if (!canGoBack) {\n return {\n id: command.id,\n success: false,\n error: 'No previous page in history',\n };\n }\n \n // 执行后退\n await cdp.evaluate(tabId, 'window.history.back()');\n \n // 等待页面加载\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const updatedTab = await chrome.tabs.get(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Back failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Back failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 forward 命令 - 前进\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleForward(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n console.log('[CommandHandler] Going forward in tab:', tabId);\n\n try {\n // v2.0: 使用 CDP Service\n await cdp.evaluate(tabId, 'window.history.forward()');\n \n // 等待页面加载\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n const updatedTab = await chrome.tabs.get(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Forward failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Forward failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 refresh 命令 - 刷新页面\n */\nasync function handleRefresh(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n console.log('[CommandHandler] Refreshing tab:', activeTab.id);\n\n try {\n await chrome.tabs.reload(activeTab.id);\n await waitForTabLoad(activeTab.id);\n const updatedTab = await chrome.tabs.get(activeTab.id);\n\n return {\n id: command.id,\n success: true,\n data: {\n url: updatedTab.url || '',\n title: updatedTab.title || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Refresh failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Refresh failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 eval 命令 - 在页面执行 JavaScript\n * v2.0: 使用 CDP Runtime.evaluate\n */\nasync function handleEval(command: CommandEvent): Promise<CommandResult> {\n const script = command.script as string;\n\n if (!script) {\n return {\n id: command.id,\n success: false,\n error: 'Missing script parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot execute script on restricted page: ${url}`,\n };\n }\n\n console.log('[CommandHandler] Evaluating script:', script.substring(0, 100));\n\n const tabId = activeTab.id;\n\n try {\n // v2.0: 使用 CDP Service\n const result = await cdp.evaluate(tabId, script);\n\n console.log('[CommandHandler] Eval result:', JSON.stringify(result));\n\n return {\n id: command.id,\n success: true,\n data: {\n result,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Eval failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Eval failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n// v2.0: 状态管理已移到 cdp-service.ts\n\n/**\n * 处理 tab_list 命令 - 列出所有标签页\n */\nasync function handleTabList(command: CommandEvent): Promise<CommandResult> {\n console.log('[CommandHandler] Listing all tabs');\n\n try {\n // 获取当前窗口的所有标签页\n const tabs = await chrome.tabs.query({ currentWindow: true });\n\n // 转换为 TabInfo 格式\n const tabInfos = tabs.map(tab => ({\n index: tab.index,\n url: tab.url || '',\n title: tab.title || '',\n active: tab.active || false,\n tabId: tab.id || 0,\n }));\n\n // 找到当前活动标签页的索引\n const activeTab = tabInfos.find(t => t.active);\n const activeIndex = activeTab?.index ?? 0;\n\n return {\n id: command.id,\n success: true,\n data: {\n tabs: tabInfos,\n activeIndex,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab list failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab list failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_new 命令 - 新建标签页\n */\nasync function handleTabNew(command: CommandEvent): Promise<CommandResult> {\n const url = command.url as string | undefined;\n\n console.log('[CommandHandler] Creating new tab:', url || 'about:blank');\n\n try {\n const createOptions: chrome.tabs.CreateProperties = { active: true };\n if (url) {\n createOptions.url = url;\n }\n\n const tab = await chrome.tabs.create(createOptions);\n\n // 如果有 URL,等待页面加载完成\n if (url && tab.id) {\n await waitForTabLoad(tab.id);\n }\n\n // 获取最新的标签页信息\n const updatedTab = tab.id ? await chrome.tabs.get(tab.id) : tab;\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: updatedTab.id,\n title: updatedTab.title || '',\n url: updatedTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab new failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab new failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_select 命令 - 切换到指定标签页\n */\nasync function handleTabSelect(command: CommandEvent): Promise<CommandResult> {\n const index = command.index as number | undefined;\n const tabIdParam = command.tabId as number | undefined;\n\n if (index === undefined && tabIdParam === undefined) {\n return {\n id: command.id,\n success: false,\n error: 'Missing index or tabId parameter',\n };\n }\n\n console.log('[CommandHandler] Selecting tab:', tabIdParam !== undefined ? `tabId=${tabIdParam}` : `index=${index}`);\n\n try {\n let targetTab: chrome.tabs.Tab;\n\n if (tabIdParam !== undefined) {\n // 按 tabId 直接定位\n targetTab = await chrome.tabs.get(tabIdParam);\n } else {\n // 按 index 定位(兼容旧逻辑)\n const tabs = await chrome.tabs.query({ currentWindow: true });\n const found = tabs.find(t => t.index === index);\n\n if (!found || !found.id) {\n return {\n id: command.id,\n success: false,\n error: `No tab found at index ${index} (total tabs: ${tabs.length})`,\n };\n }\n targetTab = found;\n }\n\n // 激活标签页\n await chrome.tabs.update(targetTab.id!, { active: true });\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId: targetTab.id,\n title: targetTab.title || '',\n url: targetTab.url || '',\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab select failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab select failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 tab_close 命令 - 关闭标签页\n */\nasync function handleTabClose(command: CommandEvent): Promise<CommandResult> {\n const index = command.index as number | undefined;\n const tabIdParam = command.tabId as number | undefined;\n\n console.log('[CommandHandler] Closing tab:', tabIdParam !== undefined ? `tabId=${tabIdParam}` : (index !== undefined ? `index=${index}` : 'current'));\n\n try {\n let targetTab: chrome.tabs.Tab;\n\n if (tabIdParam !== undefined) {\n // 按 tabId 直接定位\n targetTab = await chrome.tabs.get(tabIdParam);\n } else if (index !== undefined) {\n // 按 index 定位(兼容旧逻辑)\n const tabs = await chrome.tabs.query({ currentWindow: true });\n const found = tabs.find(t => t.index === index);\n\n if (!found || !found.id) {\n return {\n id: command.id,\n success: false,\n error: `No tab found at index ${index} (total tabs: ${tabs.length})`,\n };\n }\n\n targetTab = found;\n } else {\n // 关闭当前活动标签页\n const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true });\n\n if (!activeTab || !activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n targetTab = activeTab;\n }\n\n const tabId = targetTab.id!;\n const title = targetTab.title || '';\n const url = targetTab.url || '';\n\n await chrome.tabs.remove(tabId);\n\n // 清理 tab 相关状态\n cleanupDomTab(tabId);\n cleanupCdpTab(tabId);\n tabActiveFrameId.delete(tabId);\n\n return {\n id: command.id,\n success: true,\n data: {\n tabId,\n title,\n url,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Tab close failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Tab close failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 frame 命令 - 切换到指定 iframe\n */\nasync function handleFrame(command: CommandEvent): Promise<CommandResult> {\n const selector = command.selector as string;\n\n if (!selector) {\n return {\n id: command.id,\n success: false,\n error: 'Missing selector parameter',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n console.log('[CommandHandler] Switching to frame:', selector);\n\n try {\n // 1. 在页面中找到 iframe 元素并获取其信息\n const iframeInfoResults = await chrome.scripting.executeScript({\n target: { tabId, frameIds: tabActiveFrameId.get(tabId) !== null && tabActiveFrameId.get(tabId) !== undefined ? [tabActiveFrameId.get(tabId)!] : [0] },\n func: (sel: string) => {\n const iframe = document.querySelector(sel) as HTMLIFrameElement | null;\n if (!iframe) {\n return { found: false, error: `找不到 iframe: ${sel}` };\n }\n if (iframe.tagName.toLowerCase() !== 'iframe' && iframe.tagName.toLowerCase() !== 'frame') {\n return { found: false, error: `元素不是 iframe: ${iframe.tagName}` };\n }\n return {\n found: true,\n name: iframe.name || '',\n src: iframe.src || '',\n // 获取 iframe 在页面中的位置用于匹配\n rect: iframe.getBoundingClientRect(),\n };\n },\n args: [selector],\n });\n\n const iframeInfo = iframeInfoResults[0]?.result as {\n found: boolean;\n error?: string;\n name?: string;\n src?: string;\n rect?: DOMRect;\n };\n\n if (!iframeInfo || !iframeInfo.found) {\n return {\n id: command.id,\n success: false,\n error: iframeInfo?.error || `找不到 iframe: ${selector}`,\n };\n }\n\n // 2. 获取所有 frames\n const frames = await chrome.webNavigation.getAllFrames({ tabId });\n\n if (!frames || frames.length === 0) {\n return {\n id: command.id,\n success: false,\n error: '无法获取页面 frames',\n };\n }\n\n // 3. 尝试通过 URL 或 name 匹配 frameId\n let targetFrameId: number | null = null;\n\n // 首先尝试通过 src URL 匹配\n if (iframeInfo.src) {\n const matchedFrame = frames.find(f => \n f.url === iframeInfo.src || \n f.url.includes(iframeInfo.src!) ||\n iframeInfo.src!.includes(f.url)\n );\n if (matchedFrame) {\n targetFrameId = matchedFrame.frameId;\n }\n }\n\n // 如果没有匹配到,尝试通过非主 frame 排除\n if (targetFrameId === null) {\n // 获取非主 frame 的列表(排除 frameId 为 0 的主 frame)\n const childFrames = frames.filter(f => f.frameId !== 0);\n \n if (childFrames.length === 1) {\n // 只有一个子 frame,直接使用它\n targetFrameId = childFrames[0].frameId;\n } else if (childFrames.length > 1) {\n // 多个子 frame,尝试用 name 匹配\n if (iframeInfo.name) {\n // 目前无法直接通过 name 匹配,需要更复杂的逻辑\n // 暂时使用第一个匹配 URL 的 frame\n console.log('[CommandHandler] Multiple frames found, using URL matching');\n }\n \n // 如果还是没找到,返回错误\n if (targetFrameId === null) {\n return {\n id: command.id,\n success: false,\n error: `找到多个子 frame,无法确定目标。请使用更精确的 selector 或确保 iframe 有 src 属性。`,\n };\n }\n } else {\n return {\n id: command.id,\n success: false,\n error: '页面中没有子 frame',\n };\n }\n }\n\n // 4. 验证 frameId 是否有效(尝试在该 frame 中执行脚本)\n try {\n await chrome.scripting.executeScript({\n target: { tabId, frameIds: [targetFrameId] },\n func: () => true,\n });\n } catch (e) {\n return {\n id: command.id,\n success: false,\n error: `无法访问 frame (frameId: ${targetFrameId}),可能是跨域 iframe`,\n };\n }\n\n // 5. 保存 activeFrameId 并同步到 cdp-dom-service\n tabActiveFrameId.set(tabId, targetFrameId);\n cdpDom.setActiveFrameId(tabId, String(targetFrameId));\n\n const matchedFrameInfo = frames.find(f => f.frameId === targetFrameId);\n\n return {\n id: command.id,\n success: true,\n data: {\n frameInfo: {\n selector,\n name: iframeInfo.name,\n url: matchedFrameInfo?.url || iframeInfo.src,\n frameId: targetFrameId,\n },\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Frame switch failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Frame switch failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 frame_main 命令 - 返回主 frame\n */\nasync function handleFrameMain(command: CommandEvent): Promise<CommandResult> {\n console.log('[CommandHandler] Switching to main frame');\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n // 重置 activeFrameId 并同步到 cdp-dom-service\n tabActiveFrameId.set(tabId, null);\n cdpDom.setActiveFrameId(tabId, null);\n\n return {\n id: command.id,\n success: true,\n data: {\n frameInfo: {\n frameId: 0,\n },\n },\n };\n}\n\n/**\n * 处理 dialog 命令 - 接受或拒绝对话框\n * v2.0: 使用 CDP Page.handleJavaScriptDialog\n */\nasync function handleDialog(command: CommandEvent): Promise<CommandResult> {\n const dialogResponse = command.dialogResponse as 'accept' | 'dismiss';\n const promptText = command.promptText as string | undefined;\n\n if (!dialogResponse || !['accept', 'dismiss'].includes(dialogResponse)) {\n return {\n id: command.id,\n success: false,\n error: 'Missing or invalid dialogResponse parameter (accept/dismiss)',\n };\n }\n\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n\n console.log('[CommandHandler] Handling dialog:', dialogResponse, 'promptText:', promptText);\n\n try {\n // v2.0: 使用 CDP Service\n const pendingDialog = cdp.getPendingDialog(tabId);\n\n if (!pendingDialog) {\n return {\n id: command.id,\n success: false,\n error: '没有待处理的对话框',\n };\n }\n\n // 处理 dialog\n await cdp.handleJavaScriptDialog(\n tabId,\n dialogResponse === 'accept',\n dialogResponse === 'accept' ? promptText : undefined\n );\n\n // 获取 dialog 信息\n const dialogInfo = {\n type: pendingDialog.type,\n message: pendingDialog.message,\n handled: true,\n };\n\n return {\n id: command.id,\n success: true,\n data: {\n dialogInfo,\n },\n };\n } catch (error) {\n console.error('[CommandHandler] Dialog handling failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Dialog failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 等待标签页加载完成\n */\nfunction waitForTabLoad(tabId: number, timeout = 30000): Promise<void> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n chrome.tabs.onUpdated.removeListener(listener);\n reject(new Error('Tab load timeout'));\n }, timeout);\n\n const listener = (updatedTabId: number, changeInfo: chrome.tabs.TabChangeInfo) => {\n if (updatedTabId === tabId && changeInfo.status === 'complete') {\n clearTimeout(timeoutId);\n chrome.tabs.onUpdated.removeListener(listener);\n resolve();\n }\n };\n\n chrome.tabs.onUpdated.addListener(listener);\n });\n}\n\n// ============================================================================\n// Network/Console/Errors 命令处理\n// ============================================================================\n\n/**\n * 处理 network 命令 - 网络监控和拦截\n */\nasync function handleNetwork(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = command.networkCommand as string;\n const urlPattern = command.url as string | undefined;\n\n console.log('[CommandHandler] Network command:', subCommand, urlPattern);\n\n try {\n switch (subCommand) {\n case 'requests': {\n // 确保网络监控已启用\n await cdp.enableNetwork(tabId);\n const filter = command.filter as string | undefined;\n const requests = cdp.getNetworkRequests(tabId, filter);\n \n // 转换为简化格式\n const networkRequests = requests.map(r => ({\n requestId: r.requestId,\n url: r.url,\n method: r.method,\n type: r.type,\n timestamp: r.timestamp,\n status: r.response?.status,\n statusText: r.response?.statusText,\n failed: r.failed,\n failureReason: r.failureReason,\n }));\n\n return {\n id: command.id,\n success: true,\n data: {\n networkRequests,\n },\n };\n }\n\n case 'route': {\n if (!urlPattern) {\n return {\n id: command.id,\n success: false,\n error: 'URL pattern required for route command',\n };\n }\n \n const options = command.routeOptions || {};\n await cdp.addNetworkRoute(tabId, urlPattern, options);\n const routeCount = cdp.getNetworkRoutes(tabId).length;\n\n return {\n id: command.id,\n success: true,\n data: {\n routeCount,\n },\n };\n }\n\n case 'unroute': {\n cdp.removeNetworkRoute(tabId, urlPattern);\n const routeCount = cdp.getNetworkRoutes(tabId).length;\n\n return {\n id: command.id,\n success: true,\n data: {\n routeCount,\n },\n };\n }\n\n case 'clear': {\n cdp.clearNetworkRequests(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown network subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Network command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Network command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 console 命令 - 控制台消息\n */\nasync function handleConsole(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = (command.consoleCommand || 'get') as string;\n\n console.log('[CommandHandler] Console command:', subCommand);\n\n try {\n // 确保 console 监控已启用\n await cdp.enableConsole(tabId);\n\n switch (subCommand) {\n case 'get': {\n const messages = cdp.getConsoleMessages(tabId);\n return {\n id: command.id,\n success: true,\n data: {\n consoleMessages: messages,\n },\n };\n }\n\n case 'clear': {\n cdp.clearConsoleMessages(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown console subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Console command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Console command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 errors 命令 - JS 错误\n */\nasync function handleErrors(command: CommandEvent): Promise<CommandResult> {\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n const tabId = activeTab.id;\n const subCommand = (command.errorsCommand || 'get') as string;\n\n console.log('[CommandHandler] Errors command:', subCommand);\n\n try {\n // 确保 console 监控已启用(errors 也通过 Runtime 捕获)\n await cdp.enableConsole(tabId);\n\n switch (subCommand) {\n case 'get': {\n const errors = cdp.getJSErrors(tabId);\n return {\n id: command.id,\n success: true,\n data: {\n jsErrors: errors,\n },\n };\n }\n\n case 'clear': {\n cdp.clearJSErrors(tabId);\n return {\n id: command.id,\n success: true,\n data: {},\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown errors subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Errors command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Errors command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * 处理 trace 命令 - 录制用户操作\n */\nasync function handleTrace(command: CommandEvent): Promise<CommandResult> {\n const subCommand = (command.traceCommand || 'status') as string;\n\n console.log('[CommandHandler] Trace command:', subCommand);\n\n try {\n switch (subCommand) {\n case 'start': {\n // 获取目标标签页\n const activeTab = await resolveTab(command);\n\n if (!activeTab.id) {\n return {\n id: command.id,\n success: false,\n error: 'No active tab found',\n };\n }\n\n // 检查是否是特殊页面\n const url = activeTab.url || '';\n if (url.startsWith('chrome://') || url.startsWith('about:') || url.startsWith('chrome-extension://')) {\n return {\n id: command.id,\n success: false,\n error: `Cannot record on restricted page: ${url}`,\n };\n }\n\n // 开始录制\n await traceService.startRecording(activeTab.id);\n const status = traceService.getStatus();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceStatus: status,\n },\n };\n }\n\n case 'stop': {\n // 停止录制并获取事件\n const events = await traceService.stopRecording();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceEvents: events,\n traceStatus: {\n recording: false,\n eventCount: events.length,\n },\n },\n };\n }\n\n case 'status': {\n const status = traceService.getStatus();\n\n return {\n id: command.id,\n success: true,\n data: {\n traceStatus: status,\n },\n };\n }\n\n default:\n return {\n id: command.id,\n success: false,\n error: `Unknown trace subcommand: ${subCommand}`,\n };\n }\n } catch (error) {\n console.error('[CommandHandler] Trace command failed:', error);\n return {\n id: command.id,\n success: false,\n error: `Trace command failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n","/**\n * bb-browser Background Service Worker\n *\n * 负责:\n * - 通过 SSE 连接 Daemon 接收命令\n * - 协调 Content Scripts\n * - 管理扩展状态\n * - 使用 chrome.alarms 保持 Service Worker 活跃\n */\n\nimport { SSEClient } from './sse-client';\nimport { handleCommand } from './command-handler';\n\n// 保活 Alarm 名称\nconst KEEPALIVE_ALARM = 'bb-browser-keepalive';\n\n// 创建 SSE 客户端\nconst sseClient = new SSEClient();\n\n// 注册命令处理器\nsseClient.onCommand(handleCommand);\n\n// 监听上游 URL 变更,立即重连\nchrome.storage.onChanged.addListener((changes, area) => {\n if (area === 'sync' && changes.upstreamUrl) {\n const newUrl = changes.upstreamUrl.newValue || 'default';\n console.log('[bb-browser] Upstream URL changed to:', newUrl, '— reconnecting...');\n sseClient.disconnect();\n sseClient.connect();\n }\n});\n\n// 监听来自 Content Script 的消息\nchrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n console.log('[bb-browser] Message from content script:', message, 'sender:', sender.tab?.id);\n sendResponse({ received: true });\n return true;\n});\n\n// 设置保活 Alarm(每 25 秒触发一次,防止 Service Worker 休眠)\nasync function setupKeepaliveAlarm() {\n // 先清除可能存在的旧 alarm\n await chrome.alarms.clear(KEEPALIVE_ALARM);\n \n // 创建新的 alarm,periodInMinutes 最小值是 0.5(30秒),但我们可以用更短的\n // MV3 允许 periodInMinutes >= 0.5,但 delayInMinutes 可以更短\n // 使用 0.4 分钟 = 24 秒\n await chrome.alarms.create(KEEPALIVE_ALARM, {\n periodInMinutes: 0.4, // 24 秒\n });\n \n console.log('[bb-browser] Keepalive alarm set (every 24s)');\n}\n\n// Alarm 触发时检查并重连\nchrome.alarms.onAlarm.addListener((alarm) => {\n if (alarm.name === KEEPALIVE_ALARM) {\n console.log('[bb-browser] Keepalive alarm triggered, checking connection...');\n \n // 检查 SSE 连接状态,如果断开则重连\n if (!sseClient.isConnected()) {\n console.log('[bb-browser] SSE disconnected, reconnecting...');\n sseClient.connect();\n }\n }\n});\n\n// 扩展安装/更新事件\nchrome.runtime.onInstalled.addListener((details) => {\n console.log('[bb-browser] Extension installed/updated:', details.reason);\n // 安装后自动连接\n sseClient.connect();\n setupKeepaliveAlarm();\n});\n\n// Service Worker 启动时连接\nchrome.runtime.onStartup.addListener(() => {\n console.log('[bb-browser] Browser started, connecting to daemon...');\n sseClient.connect();\n setupKeepaliveAlarm();\n});\n\n// 立即尝试连接(处理扩展重载的情况)\nconsole.log('[bb-browser] Background service worker started, connecting to daemon...');\nsseClient.connect();\nsetupKeepaliveAlarm();\n"],"names":["pressKey","cleanupTab","tabSnapshotRefs","tabActiveFrameId","getSnapshot","legacyGetSnapshot","cdp.evaluate","cdp.click","cdp.moveMouse","cdp.insertText","cdp.pressKey","cdp.scroll","cdp.initEventListeners","cdpDom.getSnapshot","cdpDom.clickElement","cdpDom.hoverElement","cdpDom.fillElement","cdpDom.typeElement","cdpDom.checkElement","cdpDom.uncheckElement","cdpDom.selectOption","cleanupDomTab","cleanupCdpTab","cdpDom.getElementText","cdpDom.waitForElement","cdpDom.pressKey","cdpDom.scrollPage","cdpDom.setActiveFrameId","cdp.getPendingDialog","cdp.handleJavaScriptDialog","cdp.enableNetwork","cdp.getNetworkRequests","cdp.addNetworkRoute","cdp.getNetworkRoutes","cdp.removeNetworkRoute","cdp.clearNetworkRequests","cdp.enableConsole","cdp.getConsoleMessages","cdp.clearConsoleMessages","cdp.getJSErrors","cdp.clearJSErrors","traceService.startRecording","traceService.getStatus","traceService.stopRecording"],"mappings":"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"}