@ui-tars/operator-browser
Version:
Native-browser operator for UI-TARS
1 lines • 4 kB
Source Map (JSON)
{"version":3,"file":"shortcuts.mjs","sources":["webpack://@ui-tars/operator-browser/./src/shortcuts.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport os from 'os';\n\nimport type { KeyInput, Page, BrowserType } from '@agent-infra/browser';\n\nfunction isMacChrome(browser: BrowserType) {\n return os.platform() === 'darwin' && browser === 'chrome';\n}\n\nfunction delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Only adapt for a few common shortcuts.\n *\n * Mac shortcuts list: https://support.apple.com/zh-cn/102650\n * CDP: https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchKeyEvent\n * Commands: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/editing/commands/editor_command_names.h\n */\nconst ShortcutsMap = new Map<string, { key: KeyInput; commands: string }>([\n ['Meta+KeyA', { key: 'KeyA', commands: 'SelectAll' }],\n ['Meta+KeyX', { key: 'KeyX', commands: 'Cut' }],\n ['Meta+KeyC', { key: 'KeyC', commands: 'Copy' }],\n ['Meta+KeyV', { key: 'KeyV', commands: 'Paste' }],\n ['Meta+KeyZ', { key: 'KeyZ', commands: 'Undo' }],\n ['Meta+KeyY', { key: 'KeyY', commands: 'Redo' }],\n ['Meta+Shift+KeyZ', { key: 'KeyZ', commands: 'Redo' }],\n ['Shift+Meta+KeyZ', { key: 'KeyZ', commands: 'Redo' }],\n]);\n\nexport async function shortcuts(\n page: Page,\n shortcuts: KeyInput[],\n browser: BrowserType,\n) {\n if (shortcuts.length === 1) {\n await page.keyboard.down(shortcuts[0]);\n await delay(100);\n await page.keyboard.up(shortcuts[0]);\n\n return;\n }\n\n /**\n * There are some issues with simulating system shortcuts on macOS using CDP.\n * Here, we adapt a few common shortcuts.\n *\n * https://github.com/puppeteer/puppeteer/issues/776\n */\n if (isMacChrome(browser)) {\n const matched = ShortcutsMap.get(shortcuts.join('+'));\n if (matched) {\n await page.keyboard.down(matched.key, { commands: [matched.commands] });\n await delay(100);\n await page.keyboard.up(matched.key);\n\n return;\n }\n }\n\n /**\n * System Shortcuts\n *\n * Mac: firefox\n * Win: firefox, chrome\n * Linux: firefox, chrome (no test)\n *\n *\n * Browser App Shortcuts\n *\n * Mac: firefox, chrome\n * Win: firefox, chrome\n * Linux: firefox, chrome (no test)\n */\n for (const key of shortcuts) {\n await page.keyboard.down(key);\n }\n await delay(100);\n for (const key of shortcuts.reverse()) {\n await page.keyboard.up(key);\n }\n}\n"],"names":["isMacChrome","browser","os","delay","ms","Promise","resolve","setTimeout","ShortcutsMap","Map","shortcuts","page","matched","key"],"mappings":";;;;;AAQA,SAASA,YAAYC,OAAoB;IACvC,OAAOC,AAAkB,aAAlBA,GAAG,QAAQ,MAAmBD,AAAY,aAAZA;AACvC;AAEA,SAASE,MAAMC,EAAU;IACvB,OAAO,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AACtD;AASA,MAAMI,eAAe,IAAIC,IAAiD;IACxE;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAY;KAAE;IACrD;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAM;KAAE;IAC/C;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAO;KAAE;IAChD;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAQ;KAAE;IACjD;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAO;KAAE;IAChD;QAAC;QAAa;YAAE,KAAK;YAAQ,UAAU;QAAO;KAAE;IAChD;QAAC;QAAmB;YAAE,KAAK;YAAQ,UAAU;QAAO;KAAE;IACtD;QAAC;QAAmB;YAAE,KAAK;YAAQ,UAAU;QAAO;KAAE;CACvD;AAEM,eAAeC,oBACpBC,IAAU,EACVD,SAAqB,EACrBT,OAAoB;IAEpB,IAAIS,AAAqB,MAArBA,UAAU,MAAM,EAAQ;QAC1B,MAAMC,KAAK,QAAQ,CAAC,IAAI,CAACD,SAAS,CAAC,EAAE;QACrC,MAAMP,MAAM;QACZ,MAAMQ,KAAK,QAAQ,CAAC,EAAE,CAACD,SAAS,CAAC,EAAE;QAEnC;IACF;IAQA,IAAIV,YAAYC,UAAU;QACxB,MAAMW,UAAUJ,aAAa,GAAG,CAACE,UAAU,IAAI,CAAC;QAChD,IAAIE,SAAS;YACX,MAAMD,KAAK,QAAQ,CAAC,IAAI,CAACC,QAAQ,GAAG,EAAE;gBAAE,UAAU;oBAACA,QAAQ,QAAQ;iBAAC;YAAC;YACrE,MAAMT,MAAM;YACZ,MAAMQ,KAAK,QAAQ,CAAC,EAAE,CAACC,QAAQ,GAAG;YAElC;QACF;IACF;IAgBA,KAAK,MAAMC,OAAOH,UAChB,MAAMC,KAAK,QAAQ,CAAC,IAAI,CAACE;IAE3B,MAAMV,MAAM;IACZ,KAAK,MAAMU,OAAOH,UAAU,OAAO,GACjC,MAAMC,KAAK,QAAQ,CAAC,EAAE,CAACE;AAE3B"}