From 944493a39b1811e4d801702f738d44d6e852f993 Mon Sep 17 00:00:00 2001 From: peima Date: Sat, 1 Aug 2026 23:20:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(runtime):=20e2e=20=E5=8F=91=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=203=20=E4=B8=AA=20bug=20=E4=BF=AE=E5=A4=8D=20-=20down?= =?UTF-8?q?load:=20desktop=5Fdownload=5Fapps=20SingleChildScrollView=20?= =?UTF-8?q?=E5=8A=A0=20primary:true=20(Scrollbar=20=E7=BC=BA=20ScrollPosit?= =?UTF-8?q?ion)=20-=20contact-stores:=20checkDomainAvailability=20async=20?= =?UTF-8?q?=E5=90=8E=20setState=20=E5=8A=A0=20mounted=20=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=20(dispose=20=E5=90=8E=20setState)=20-=20buy-service:=20=5Floa?= =?UTF-8?q?dData=20=E5=8A=A0=20data=20=E7=BB=93=E6=9E=84=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=20+=20mounted=20=E4=BF=9D=E6=8A=A4=20(API=20400=20=E6=97=A0?= =?UTF-8?q?=E6=95=88=E5=8F=82=E6=95=B0=E6=97=B6=20data=20=E4=B8=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=BB=93=E6=9E=84=20->=20RangeError)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/buy_service.dart | 8 +- .../desktop/create_online_store_1.dart | 2 +- .../desktop/desktop_download_apps.dart | 1 + tools/e2e/api_buy.js | 13 + tools/e2e/capture_api.js | 22 + tools/e2e/capture_data.js | 12 + tools/e2e/capture_data2.js | 21 + tools/e2e/diag.js | 33 + tools/e2e/diag2.js | 32 + tools/e2e/dump_idb.js | 47 + tools/e2e/login.png | Bin 0 -> 832634 bytes tools/e2e/login_semantics.png | Bin 0 -> 61761 bytes tools/e2e/node_modules/.bin/playwright | 1 + tools/e2e/node_modules/.bin/playwright-core | 1 + tools/e2e/node_modules/.package-lock.json | 38 + .../e2e/node_modules/playwright-core/LICENSE | 202 + tools/e2e/node_modules/playwright-core/NOTICE | 5 + .../node_modules/playwright-core/README.md | 3 + .../playwright-core/ThirdPartyNotices.txt | 13 + .../bin/install_media_pack.ps1 | 5 + .../bin/install_webkit_wsl.ps1 | 33 + .../bin/reinstall_chrome_beta_linux.sh | 42 + .../bin/reinstall_chrome_beta_mac.sh | 13 + .../bin/reinstall_chrome_beta_win.ps1 | 24 + .../bin/reinstall_chrome_stable_linux.sh | 42 + .../bin/reinstall_chrome_stable_mac.sh | 12 + .../bin/reinstall_chrome_stable_win.ps1 | 24 + .../bin/reinstall_msedge_beta_linux.sh | 48 + .../bin/reinstall_msedge_beta_mac.sh | 11 + .../bin/reinstall_msedge_beta_win.ps1 | 23 + .../bin/reinstall_msedge_dev_linux.sh | 48 + .../bin/reinstall_msedge_dev_mac.sh | 11 + .../bin/reinstall_msedge_dev_win.ps1 | 23 + .../bin/reinstall_msedge_stable_linux.sh | 48 + .../bin/reinstall_msedge_stable_mac.sh | 11 + .../bin/reinstall_msedge_stable_win.ps1 | 24 + .../playwright-core/browsers.json | 75 + tools/e2e/node_modules/playwright-core/cli.js | 21 + .../node_modules/playwright-core/index.d.ts | 17 + .../e2e/node_modules/playwright-core/index.js | 17 + .../node_modules/playwright-core/index.mjs | 28 + .../playwright-core/lib/bootstrap.js | 88 + .../playwright-core/lib/coreBundle.js | 74830 +++++++++++++ .../playwright-core/lib/entry/cliDaemon.js | 5 + .../playwright-core/lib/entry/dashboardApp.js | 3 + .../playwright-core/lib/entry/mcp.js | 10 + .../lib/entry/oopBrowserDownload.js | 3 + .../playwright-core/lib/package.js | 50 + .../lib/server/chromium/appIcon.png | Bin 0 -> 16565 bytes .../lib/server/electron/loader.js | 118 + .../playwright-core/lib/serverRegistry.js | 7347 ++ .../lib/serverRegistry.js.LICENSE | 354 + .../lib/tools/cli-client/channelSessions.js | 141 + .../lib/tools/cli-client/cli.js | 6 + .../lib/tools/cli-client/help.json | 708 + .../lib/tools/cli-client/minimist.js | 128 + .../lib/tools/cli-client/output.js | 343 + .../lib/tools/cli-client/program.js | 404 + .../lib/tools/cli-client/registry.js | 176 + .../lib/tools/cli-client/session.js | 258 + .../lib/tools/dashboard/appIcon.png | Bin 0 -> 18945 bytes .../lib/tools/skills/playwright-cli/SKILL.md | 420 + .../references/element-attributes.md | 23 + .../references/playwright-tests.md | 39 + .../references/request-mocking.md | 87 + .../playwright-cli/references/running-code.md | 241 + .../references/session-management.md | 225 + .../references/storage-state.md | 275 + .../references/test-generation.md | 433 + .../playwright-cli/references/tracing.md | 139 + .../references/video-recording.md | 143 + .../playwright-component-testing/SKILL.md | 143 + .../references/gallery-spec.md | 144 + .../references/migration.md | 85 + .../references/react.md | 67 + .../references/vue.md | 75 + .../tools/skills/playwright-trace/SKILL.md | 171 + .../lib/tools/utils/extension.js | 101 + .../lib/tools/utils/socketConnection.js | 108 + .../playwright-core/lib/utilsBundle.js | 90764 ++++++++++++++++ .../lib/utilsBundle.js.LICENSE | 2179 + .../dashboard/assets/codicon-DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../dashboard/assets/firefox-1bWoP6pv.svg | 1 + .../assets/firefox-beta-k3eOH_eK.svg | 1 + .../assets/firefox-nightly-Cp5nfeDT.svg | 1 + .../vite/dashboard/assets/index-CyWAfh-p.js | 11 + .../vite/dashboard/assets/index-DhC616m4.css | 1 + .../vite/dashboard/assets/safari-na3_-uQk.svg | 1 + .../lib/vite/dashboard/index.html | 29 + .../lib/vite/dashboard/playwright-logo.svg | 24 + .../lib/vite/htmlReport/index.html | 16 + .../lib/vite/htmlReport/report.css | 2 + .../lib/vite/htmlReport/report.js | 32 + .../assets/codeMirrorModule--QdMvsKi.css | 1 + .../assets/codeMirrorModule-CwYYHbcZ.js | 32 + .../vite/recorder/assets/codicon-DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../vite/recorder/assets/index-DYjdXIbE.js | 129 + .../vite/recorder/assets/index-l_lX622x.css | 1 + .../lib/vite/recorder/index.html | 29 + .../lib/vite/recorder/playwright-logo.svg | 9 + .../assets/codeMirrorModule-rXmQmLUY.js | 32 + .../assets/defaultSettingsView-B-dXF5JN.js | 181 + .../traceViewer/assets/urlMatch-L3liM589.js | 1 + .../assets/xtermModule-BuZfJS5v.js | 7 + .../traceViewer/codeMirrorModule.-QdMvsKi.css | 1 + .../lib/vite/traceViewer/codicon.DCmgc-ay.ttf | Bin 0 -> 80340 bytes .../defaultSettingsView.BLFoOugd.css | 1 + .../lib/vite/traceViewer/index.B_TqY17P.css | 1 + .../lib/vite/traceViewer/index.KZ4wOW1K.js | 1 + .../lib/vite/traceViewer/index.html | 44 + .../lib/vite/traceViewer/manifest.webmanifest | 16 + .../lib/vite/traceViewer/playwright-logo.svg | 9 + .../lib/vite/traceViewer/snapshot.B_Jk1wbt.js | 1 + .../lib/vite/traceViewer/snapshot.html | 10 + .../lib/vite/traceViewer/sw.bundle.js | 4 + .../lib/vite/traceViewer/uiMode.C7UW1sC9.css | 1 + .../lib/vite/traceViewer/uiMode.Dzuouizj.js | 5 + .../lib/vite/traceViewer/uiMode.html | 18 + .../vite/traceViewer/xtermModule.kHJ-D0s7.css | 1 + .../playwright-core/lib/webp_codec.LICENSE | 173 + .../playwright-core/lib/webp_codec.wasm | Bin 0 -> 565369 bytes .../node_modules/playwright-core/lib/xdg-open | 1267 + .../node_modules/playwright-core/package.json | 34 + .../playwright-core/types/protocol.d.ts | 24842 +++++ .../playwright-core/types/structs.d.ts | 52 + .../playwright-core/types/types.d.ts | 26188 +++++ tools/e2e/node_modules/playwright/LICENSE | 202 + tools/e2e/node_modules/playwright/NOTICE | 5 + tools/e2e/node_modules/playwright/README.md | 318 + .../playwright/ThirdPartyNotices.txt | 14 + tools/e2e/node_modules/playwright/cli.js | 19 + tools/e2e/node_modules/playwright/index.d.ts | 17 + tools/e2e/node_modules/playwright/index.js | 17 + tools/e2e/node_modules/playwright/index.mjs | 18 + .../node_modules/playwright/jsx-runtime.js | 42 + .../node_modules/playwright/jsx-runtime.mjs | 21 + .../playwright/lib/agents/agentParser.js | 89 + .../lib/agents/copilot-setup-steps.yml | 34 + .../playwright/lib/agents/generateAgents.js | 395 + .../agents/playwright-test-coverage.prompt.md | 31 + .../agents/playwright-test-generate.prompt.md | 8 + .../agents/playwright-test-generator.agent.md | 88 + .../lib/agents/playwright-test-heal.prompt.md | 6 + .../agents/playwright-test-healer.agent.md | 56 + .../lib/agents/playwright-test-plan.prompt.md | 9 + .../agents/playwright-test-planner.agent.md | 74 + .../playwright/lib/cli/reportActions.js | 78 + .../playwright/lib/cli/testActions.js | 213 + .../playwright/lib/common/index.js | 2954 + .../playwright/lib/common/index.js.txt | 34 + .../playwright/lib/errorContext.js | 129 + .../node_modules/playwright/lib/globals.js | 58 + .../e2e/node_modules/playwright/lib/index.js | 806 + .../node_modules/playwright/lib/isomorphic.js | 260 + .../playwright/lib/isomorphic.js.txt | 9 + .../lib/loader/loaderProcessEntry.js | 34 + .../lib/loader/loaderProcessEntry.js.txt | 9 + .../playwright/lib/matchers/expect.js | 13486 +++ .../playwright/lib/matchers/expect.js.LICENSE | 640 + .../playwright/lib/matchers/expect.js.txt | 67 + .../playwright/lib/mcp/test/browserBackend.js | 125 + .../playwright/lib/mcp/test/generatorTools.js | 122 + .../playwright/lib/mcp/test/plannerTools.js | 150 + .../playwright/lib/mcp/test/seed.js | 82 + .../playwright/lib/mcp/test/streams.js | 44 + .../playwright/lib/mcp/test/testBackend.js | 99 + .../playwright/lib/mcp/test/testContext.js | 306 + .../playwright/lib/mcp/test/testTool.js | 30 + .../playwright/lib/mcp/test/testTools.js | 98 + .../node_modules/playwright/lib/package.js | 47 + .../node_modules/playwright/lib/program.js | 242 + .../playwright/lib/runner/index.js | 8241 ++ .../playwright/lib/runner/index.js.txt | 60 + .../playwright/lib/transform/babelBundle.js | 72275 ++++++++++++ .../lib/transform/babelBundle.js.LICENSE | 2384 + .../lib/transform/babelBundle.js.txt | 325 + .../playwright/lib/transform/esmLoader.js | 8075 ++ .../lib/transform/esmLoader.js.LICENSE | 355 + .../playwright/lib/transform/esmLoader.js.txt | 60 + tools/e2e/node_modules/playwright/lib/util.js | 373 + .../lib/worker/workerProcessEntry.js | 1850 + .../lib/worker/workerProcessEntry.js.txt | 19 + .../e2e/node_modules/playwright/package.json | 58 + tools/e2e/node_modules/playwright/test.d.ts | 18 + tools/e2e/node_modules/playwright/test.js | 24 + tools/e2e/node_modules/playwright/test.mjs | 35 + .../node_modules/playwright/types/test.d.ts | 10848 ++ .../playwright/types/testReporter.d.ts | 899 + tools/e2e/package-lock.json | 60 + tools/e2e/package.json | 16 + tools/e2e/probe.js | 68 + tools/e2e/probe2.js | 51 + tools/e2e/probe3.js | 40 + tools/e2e/probe4.js | 27 + tools/e2e/run.js | 88 + 195 files changed, 362929 insertions(+), 3 deletions(-) create mode 100644 tools/e2e/api_buy.js create mode 100644 tools/e2e/capture_api.js create mode 100644 tools/e2e/capture_data.js create mode 100644 tools/e2e/capture_data2.js create mode 100644 tools/e2e/diag.js create mode 100644 tools/e2e/diag2.js create mode 100644 tools/e2e/dump_idb.js create mode 100644 tools/e2e/login.png create mode 100644 tools/e2e/login_semantics.png create mode 120000 tools/e2e/node_modules/.bin/playwright create mode 120000 tools/e2e/node_modules/.bin/playwright-core create mode 100644 tools/e2e/node_modules/.package-lock.json create mode 100644 tools/e2e/node_modules/playwright-core/LICENSE create mode 100644 tools/e2e/node_modules/playwright-core/NOTICE create mode 100644 tools/e2e/node_modules/playwright-core/README.md create mode 100644 tools/e2e/node_modules/playwright-core/ThirdPartyNotices.txt create mode 100644 tools/e2e/node_modules/playwright-core/bin/install_media_pack.ps1 create mode 100644 tools/e2e/node_modules/playwright-core/bin/install_webkit_wsl.ps1 create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh create mode 100644 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh create mode 100644 tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh create mode 100644 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh create mode 100644 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh create mode 100755 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh create mode 100644 tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 create mode 100644 tools/e2e/node_modules/playwright-core/browsers.json create mode 100755 tools/e2e/node_modules/playwright-core/cli.js create mode 100644 tools/e2e/node_modules/playwright-core/index.d.ts create mode 100644 tools/e2e/node_modules/playwright-core/index.js create mode 100644 tools/e2e/node_modules/playwright-core/index.mjs create mode 100644 tools/e2e/node_modules/playwright-core/lib/bootstrap.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/coreBundle.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/entry/cliDaemon.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/entry/dashboardApp.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/entry/mcp.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/entry/oopBrowserDownload.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/package.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/server/chromium/appIcon.png create mode 100644 tools/e2e/node_modules/playwright-core/lib/server/electron/loader.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/serverRegistry.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/serverRegistry.js.LICENSE create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/channelSessions.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/cli.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/help.json create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/minimist.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/output.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/program.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/registry.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/cli-client/session.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/dashboard/appIcon.png create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/SKILL.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/element-attributes.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/playwright-tests.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/request-mocking.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/running-code.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/session-management.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/storage-state.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/test-generation.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/tracing.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-cli/references/video-recording.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/SKILL.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/gallery-spec.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/migration.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/react.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-component-testing/references/vue.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/skills/playwright-trace/SKILL.md create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/utils/extension.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/tools/utils/socketConnection.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/utilsBundle.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/utilsBundle.js.LICENSE create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/index-CyWAfh-p.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/index-DhC616m4.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/index.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/htmlReport/index.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/htmlReport/report.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/htmlReport/report.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule--QdMvsKi.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-CwYYHbcZ.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/assets/index-DYjdXIbE.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/assets/index-l_lX622x.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/index.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-rXmQmLUY.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-B-dXF5JN.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-L3liM589.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-BuZfJS5v.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.-QdMvsKi.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.BLFoOugd.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/index.B_TqY17P.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/index.KZ4wOW1K.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/index.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/snapshot.B_Jk1wbt.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/uiMode.C7UW1sC9.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/uiMode.Dzuouizj.js create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html create mode 100644 tools/e2e/node_modules/playwright-core/lib/vite/traceViewer/xtermModule.kHJ-D0s7.css create mode 100644 tools/e2e/node_modules/playwright-core/lib/webp_codec.LICENSE create mode 100755 tools/e2e/node_modules/playwright-core/lib/webp_codec.wasm create mode 100755 tools/e2e/node_modules/playwright-core/lib/xdg-open create mode 100644 tools/e2e/node_modules/playwright-core/package.json create mode 100644 tools/e2e/node_modules/playwright-core/types/protocol.d.ts create mode 100644 tools/e2e/node_modules/playwright-core/types/structs.d.ts create mode 100644 tools/e2e/node_modules/playwright-core/types/types.d.ts create mode 100644 tools/e2e/node_modules/playwright/LICENSE create mode 100644 tools/e2e/node_modules/playwright/NOTICE create mode 100644 tools/e2e/node_modules/playwright/README.md create mode 100644 tools/e2e/node_modules/playwright/ThirdPartyNotices.txt create mode 100755 tools/e2e/node_modules/playwright/cli.js create mode 100644 tools/e2e/node_modules/playwright/index.d.ts create mode 100644 tools/e2e/node_modules/playwright/index.js create mode 100644 tools/e2e/node_modules/playwright/index.mjs create mode 100644 tools/e2e/node_modules/playwright/jsx-runtime.js create mode 100644 tools/e2e/node_modules/playwright/jsx-runtime.mjs create mode 100644 tools/e2e/node_modules/playwright/lib/agents/agentParser.js create mode 100644 tools/e2e/node_modules/playwright/lib/agents/copilot-setup-steps.yml create mode 100644 tools/e2e/node_modules/playwright/lib/agents/generateAgents.js create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-coverage.prompt.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-generate.prompt.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-generator.agent.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-heal.prompt.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-healer.agent.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-plan.prompt.md create mode 100644 tools/e2e/node_modules/playwright/lib/agents/playwright-test-planner.agent.md create mode 100644 tools/e2e/node_modules/playwright/lib/cli/reportActions.js create mode 100644 tools/e2e/node_modules/playwright/lib/cli/testActions.js create mode 100644 tools/e2e/node_modules/playwright/lib/common/index.js create mode 100644 tools/e2e/node_modules/playwright/lib/common/index.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/errorContext.js create mode 100644 tools/e2e/node_modules/playwright/lib/globals.js create mode 100644 tools/e2e/node_modules/playwright/lib/index.js create mode 100644 tools/e2e/node_modules/playwright/lib/isomorphic.js create mode 100644 tools/e2e/node_modules/playwright/lib/isomorphic.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/loader/loaderProcessEntry.js create mode 100644 tools/e2e/node_modules/playwright/lib/loader/loaderProcessEntry.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/matchers/expect.js create mode 100644 tools/e2e/node_modules/playwright/lib/matchers/expect.js.LICENSE create mode 100644 tools/e2e/node_modules/playwright/lib/matchers/expect.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/browserBackend.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/generatorTools.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/plannerTools.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/seed.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/streams.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/testBackend.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/testContext.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/testTool.js create mode 100644 tools/e2e/node_modules/playwright/lib/mcp/test/testTools.js create mode 100644 tools/e2e/node_modules/playwright/lib/package.js create mode 100644 tools/e2e/node_modules/playwright/lib/program.js create mode 100644 tools/e2e/node_modules/playwright/lib/runner/index.js create mode 100644 tools/e2e/node_modules/playwright/lib/runner/index.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/transform/babelBundle.js create mode 100644 tools/e2e/node_modules/playwright/lib/transform/babelBundle.js.LICENSE create mode 100644 tools/e2e/node_modules/playwright/lib/transform/babelBundle.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/transform/esmLoader.js create mode 100644 tools/e2e/node_modules/playwright/lib/transform/esmLoader.js.LICENSE create mode 100644 tools/e2e/node_modules/playwright/lib/transform/esmLoader.js.txt create mode 100644 tools/e2e/node_modules/playwright/lib/util.js create mode 100644 tools/e2e/node_modules/playwright/lib/worker/workerProcessEntry.js create mode 100644 tools/e2e/node_modules/playwright/lib/worker/workerProcessEntry.js.txt create mode 100644 tools/e2e/node_modules/playwright/package.json create mode 100644 tools/e2e/node_modules/playwright/test.d.ts create mode 100644 tools/e2e/node_modules/playwright/test.js create mode 100644 tools/e2e/node_modules/playwright/test.mjs create mode 100644 tools/e2e/node_modules/playwright/types/test.d.ts create mode 100644 tools/e2e/node_modules/playwright/types/testReporter.d.ts create mode 100644 tools/e2e/package-lock.json create mode 100644 tools/e2e/package.json create mode 100644 tools/e2e/probe.js create mode 100644 tools/e2e/probe2.js create mode 100644 tools/e2e/probe3.js create mode 100644 tools/e2e/probe4.js create mode 100644 tools/e2e/run.js diff --git a/lib/pages/buy_service.dart b/lib/pages/buy_service.dart index 84b7011..2b1d64a 100644 --- a/lib/pages/buy_service.dart +++ b/lib/pages/buy_service.dart @@ -72,12 +72,16 @@ class BuyServiceState extends State { 'store_id': '${widget.sid}', } ).then((value) { + if (!mounted) return; + if (value == null || value is! Map || value['service_selections'] == null) { + Utils.showMessageDialog(context, 'Service info unavailable'); + return; + } data = value; data!['domain'] = widget.domain; - print('data: $data'); setState(() {}); }).onError((error, stackTrace) { - Utils.showMessageDialog(context, error); + if (mounted) Utils.showMessageDialog(context, error); }); } } \ No newline at end of file diff --git a/lib/widgets/desktop/create_online_store_1.dart b/lib/widgets/desktop/create_online_store_1.dart index 5b621d0..4ac1d87 100644 --- a/lib/widgets/desktop/create_online_store_1.dart +++ b/lib/widgets/desktop/create_online_store_1.dart @@ -411,7 +411,7 @@ class CreateOnlineStore1State extends State { print('value: $value'); if (value['status'] == 'OK') { domainResult = (value['domain_check_result'] as List); - setState(() {}); + if (mounted) setState(() {}); } else if (value['status'] == 'ERROR') { String errors = ''; for (int i = 0; i < (value['errors'] as List).length; i++) { diff --git a/lib/widgets/desktop/desktop_download_apps.dart b/lib/widgets/desktop/desktop_download_apps.dart index 9009a7b..d6b5c6b 100644 --- a/lib/widgets/desktop/desktop_download_apps.dart +++ b/lib/widgets/desktop/desktop_download_apps.dart @@ -55,6 +55,7 @@ class DesktopDownloadAppsState extends State { } col.children.add(wrap); Widget view = SingleChildScrollView( + primary: true, child: Row( children: [ Container( diff --git a/tools/e2e/api_buy.js b/tools/e2e/api_buy.js new file mode 100644 index 0000000..8ab75da --- /dev/null +++ b/tools/e2e/api_buy.js @@ -0,0 +1,13 @@ +const { chromium } = require('playwright'); +(async () => { + const browser = await chromium.launch({ headless: true }); + const page = await (await browser.newContext()).newPage(); + await page.goto('http://127.0.0.1:8099/', { waitUntil: 'load' }); + await page.waitForTimeout(3000); + const data = await page.evaluate(async () => { + const r = await fetch('https://api.minipos.us/v1/get-buy-service-info/pos/1?store_id=0'); + return JSON.stringify(await r.json()); + }).catch(e => 'ERR: ' + e.message); + console.log('buy-service API:', data.slice(0, 600)); + await browser.close(); +})(); diff --git a/tools/e2e/capture_api.js b/tools/e2e/capture_api.js new file mode 100644 index 0000000..13f23b3 --- /dev/null +++ b/tools/e2e/capture_api.js @@ -0,0 +1,22 @@ +// 拦截 buy-service 的 API 请求/响应,看实际数据结构 +const { chromium } = require('playwright'); +(async () => { + const browser = await chromium.launch({ headless: true }); + const page = await (await browser.newContext({viewport:{width:1280,height:900}})).newPage(); + page.on('response', async (resp) => { + const url = resp.url(); + if (url.includes('get-buy-service-info')) { + console.log('=== buy-service API 响应 ==='); + console.log('状态:', resp.status()); + try { + const body = await resp.text(); + console.log('body:', body.slice(0, 700)); + } catch(e) { console.log('读 body 失败'); } + } + }); + page.on('pageerror', e => console.log('PAGEERR:', e.message.slice(0,150))); + page.on('console', m => { if (m.text().startsWith('data:') || m.text().includes('RangeError')) console.log('CONSOLE:', m.text().slice(0,200)); }); + await page.goto('http://127.0.0.1:8099/buy-service/1/pos', { waitUntil: 'load' }).catch(()=>{}); + await page.waitForTimeout(8000); + await browser.close(); +})(); diff --git a/tools/e2e/capture_data.js b/tools/e2e/capture_data.js new file mode 100644 index 0000000..1c3cad1 --- /dev/null +++ b/tools/e2e/capture_data.js @@ -0,0 +1,12 @@ +const { chromium } = require('playwright'); +(async () => { + const browser = await chromium.launch({ headless: true }); + const page = await (await browser.newContext({viewport:{width:1280,height:900}})).newPage(); + const logs = []; + page.on('console', m => logs.push(m.text())); + await page.goto('http://127.0.0.1:8099/buy-service/1/pos', { waitUntil: 'load' }).catch(()=>{}); + await page.waitForTimeout(6000); + const dataLog = logs.filter(l => l.startsWith('data: {') || l.startsWith('data:{')); + console.log('应用 data:', dataLog[0] ? dataLog[0].slice(0, 500) : '(未捕获)'); + await browser.close(); +})(); diff --git a/tools/e2e/capture_data2.js b/tools/e2e/capture_data2.js new file mode 100644 index 0000000..fec93d5 --- /dev/null +++ b/tools/e2e/capture_data2.js @@ -0,0 +1,21 @@ +const { chromium } = require('playwright'); +(async () => { + const browser = await chromium.launch({ headless: true }); + const page = await (await browser.newContext({viewport:{width:1280,height:900}})).newPage(); + const logs = []; + page.on('console', m => logs.push(m.text())); + page.on('pageerror', e => logs.push('PAGEERR: ' + e.message)); + await page.goto('http://127.0.0.1:8099/buy-service/1/pos', { waitUntil: 'load' }).catch(()=>{}); + await page.waitForTimeout(7000); + // 找 data 打印 + RangeError + const dataLog = logs.find(l => l.startsWith('data:')); + console.log('=== data ===', dataLog ? dataLog.slice(0,400) : '(无)'); + // 看 service_selections / options 部分 + if (dataLog) { + const m = dataLog.match(/service_selections:[^,}]+/); + if (m) console.log('service_selections:', m[0].slice(0,200)); + const o = dataLog.match(/options:[^]]*\]/); + if (o) console.log('options:', o[0].slice(0,200)); + } + await browser.close(); +})(); diff --git a/tools/e2e/diag.js b/tools/e2e/diag.js new file mode 100644 index 0000000..bc18c9e --- /dev/null +++ b/tools/e2e/diag.js @@ -0,0 +1,33 @@ +// 诊断:对失败路由打印完整错误 + CK_STACK +const { chromium } = require('playwright'); +const BASE = 'http://127.0.0.1:8099'; +const ROUTES = ['/contact-stores', '/download', '/buy-service/1/pos']; + +(async () => { + const browser = await chromium.launch({ headless: true }); + for (const route of ROUTES) { + const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } }); + const page = await ctx.newPage(); + const allLogs = []; + page.on('pageerror', e => allLogs.push(`PAGEERROR: ${e.message}`)); + page.on('console', m => allLogs.push(m.text())); + await page.goto(BASE + route, { waitUntil: 'load', timeout: 30000 }).catch(e => allLogs.push('GOTO: ' + e.message.slice(0,80))); + await page.waitForTimeout(5000); + + console.log(`\n########## ${route} ##########`); + // 只打印 CK_ERROR + CK_STACK + PAGEERROR + for (let i = 0; i < allLogs.length; i++) { + const l = allLogs[i]; + if (l.startsWith('CK_ERROR:') || l.startsWith('PAGEERROR')) { + console.log(l.slice(0, 300)); + // 找紧跟的 CK_STACK + if (allLogs[i+1] && allLogs[i+1].startsWith('CK_STACK:')) { + const proj = allLogs[i+1].match(/flutter_wisetronic\/[^\s]+:\d+/g); + console.log(' → 项目位置:', proj ? [...new Set(proj)].slice(0,4) : '(无项目帧)'); + } + } + } + await ctx.close(); + } + await browser.close(); +})(); diff --git a/tools/e2e/diag2.js b/tools/e2e/diag2.js new file mode 100644 index 0000000..9378bf7 --- /dev/null +++ b/tools/e2e/diag2.js @@ -0,0 +1,32 @@ +// 诊断 v2:打印完整 CK_STACK(定位 framework 抛的错误的源头) +const { chromium } = require('playwright'); +const BASE = 'http://127.0.0.1:8099'; +const ROUTES = ['/buy-service/1/pos', '/download']; + +(async () => { + const browser = await chromium.launch({ headless: true }); + for (const route of ROUTES) { + const ctx = await browser.newContext({ viewport: { width: 1280, height: 900 } }); + const page = await ctx.newPage(); + const allLogs = []; + page.on('pageerror', e => allLogs.push(`PAGEERROR: ${e.stack || e.message}`)); + page.on('console', m => allLogs.push(m.text())); + await page.goto(BASE + route, { waitUntil: 'load', timeout: 30000 }).catch(()=>{}); + await page.waitForTimeout(5000); + + console.log(`\n########## ${route} ##########`); + for (let i = 0; i < allLogs.length; i++) { + const l = allLogs[i]; + if (l.startsWith('CK_ERROR:') || l.startsWith('PAGEERROR')) { + console.log('--- ' + l.slice(0, 150)); + if (allLogs[i+1] && allLogs[i+1].startsWith('CK_STACK:')) { + // 打印堆栈里所有 flutter_wisetronic 帧 + const proj = allLogs[i+1].match(/flutter_wisetronic\/[^\s]+/g) || []; + console.log(' 项目帧: ' + (proj.length ? [...new Set(proj)].join('\n ') : '(无)')); + } + } + } + await ctx.close(); + } + await browser.close(); +})(); diff --git a/tools/e2e/dump_idb.js b/tools/e2e/dump_idb.js new file mode 100644 index 0000000..158fe04 --- /dev/null +++ b/tools/e2e/dump_idb.js @@ -0,0 +1,47 @@ +// dump IndexedDB 结构 + Hive entry 格式 +const { chromium } = require('playwright'); +const BASE = 'http://127.0.0.1:8099'; +(async () => { + const browser = await chromium.launch({ headless: true }); + const page = await (await browser.newContext()).newPage(); + await page.goto(BASE + '/', { waitUntil: 'load', timeout: 60000 }); + await page.waitForTimeout(7000); + + const result = await page.evaluate(async () => { + const out = {}; + const dbs = await indexedDB.databases(); + out.databases = dbs.map(d => d.name); + for (const db of dbs) { + out[db.name] = []; + await new Promise((resolve) => { + const req = indexedDB.open(db.name); + req.onsuccess = () => { + const d = req.result; + const stores = [...d.objectStoreNames]; + out[db.name + '_stores'] = stores; + if (stores.length === 0) { d.close(); resolve(); return; } + const tx = d.transaction(stores[0], 'readonly'); + const store = tx.objectStore(stores[0]); + const allReq = store.getAll(); + const keysReq = store.getAllKeys(); + allReq.onsuccess = () => { + out[db.name] = allReq.result.map((v, i) => { + let hex = ''; + if (v instanceof ArrayBuffer) { + const u = new Uint8Array(v); + hex = Array.from(u.slice(0, 40)).map(b => b.toString(16).padStart(2,'0')).join(' '); + return { key: keysReq.result[i], valueBytes: v.byteLength, hexFirst40: hex }; + } + return { key: keysReq.result[i], value: typeof v === 'string' ? v.slice(0,80) : v }; + }); + }; + tx.oncomplete = () => { d.close(); resolve(); }; + }; + req.onerror = () => resolve(); + }); + } + return out; + }); + console.log(JSON.stringify(result, null, 2)); + await browser.close(); +})().catch(e => { console.error('失败:', e.message); process.exit(1); }); diff --git a/tools/e2e/login.png b/tools/e2e/login.png new file mode 100644 index 0000000000000000000000000000000000000000..123061af5b2eac650be9c07c6f6be733ccfa9cd4 GIT binary patch literal 832634 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 z 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%0ASN#JHN>epfY1B!3O)S5>zhn%v=kmLk+L*Y32 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 x=6r8GTr;xn%%D)IHzJeOw#H;xtvT_l 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

UO*ASM2C?IzRsLkH7Y{uhm-B{_emvMsjiQ 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

` : ""; + const styleSheet = ` + @keyframes pw-chapter-fade-in { + from { opacity: 0; } + to { opacity: 1; } + } + @keyframes pw-chapter-fade-out { + from { opacity: 1; } + to { opacity: 0; } + } + #background { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(2px); + animation: pw-chapter-fade-in ${fadeDuration}ms ease-out forwards; + } + #background.fade-out { + animation: pw-chapter-fade-out ${fadeDuration}ms ease-in forwards; + } + #content { + background: rgba(0, 0, 0, 0.7); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 16px; + padding: 40px 56px; + max-width: 560px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + } + #title { + color: white; + font-family: system-ui, -apple-system, sans-serif; + font-size: 28px; + font-weight: 600; + line-height: 1.3; + text-align: center; + letter-spacing: -0.01em; + } + #description { + color: rgba(255, 255, 255, 0.7); + font-family: system-ui, -apple-system, sans-serif; + font-size: 15px; + line-height: 1.5; + margin-top: 12px; + text-align: center; + } + `; + const duration = options.duration ?? 2e3; + const html = `
${escapeHTML(options.title)}
${descriptionHtml}
`; + const id = await this.show(html); + await new Promise((f) => setTimeout(f, duration)); + const utility = await this._page.mainFrame().utilityContext(); + await utility.evaluate(({ injected, id: id2, fadeDuration: fadeDuration2 }) => { + const overlay = injected.getUserOverlay(id2); + const bg = overlay?.querySelector("#background"); + if (bg) + bg.classList.add("fade-out"); + return new Promise((f) => injected.utils.builtins.setTimeout(f, fadeDuration2)); + }, { injected: await utility.injectedScript(), id, fadeDuration }).catch((e) => debugLogger.log("error", e)); + await this.remove(id); + } + async setVisible(visible) { + if (!this._overlays.size) + return; + const utility = await this._page.mainFrame().utilityContext(); + await utility.evaluate(({ injected, visible: visible2 }) => { + injected.setUserOverlaysVisible(visible2); + }, { injected: await utility.injectedScript(), visible }).catch((e) => debugLogger.log("error", e)); + } + }; + } +}); + +// packages/playwright-core/src/server/screencast.ts +var Screencast; +var init_screencast = __esm({ + "packages/playwright-core/src/server/screencast.ts"() { + "use strict"; + init_manualPromise(); + init_protocolFormatter(); + init_debugLogger(); + init_progress(); + init_dom(); + Screencast = class { + constructor(page) { + this._clients = /* @__PURE__ */ new Map(); + this.page = page; + this.page.instrumentation.addListener(this, this.page.browserContext); + } + async handlePageOrContextClose() { + const clients = [...this._clients.keys()]; + for (const scope of this._clients.values()) + scope.reject(new Error("Screencast closed")); + this._clients.clear(); + for (const client of clients) { + if (client.gracefulClose) + await client.gracefulClose(); + } + } + dispose() { + for (const scope of this._clients.values()) + scope.reject(new Error("Screencast disposed")); + for (const client of this._clients.keys()) + client.dispose(); + this._clients.clear(); + this.page.instrumentation.removeListener(this); + } + showActions(options) { + this._actions = options; + } + hideActions() { + this._actions = void 0; + } + addClient(client) { + const isFirst = this._clients.size === 0; + this._clients.set(client, new LongStandingScope()); + if (isFirst) { + this._startScreencast(client.size, client.quality); + } else if (this._lastFrame) { + const frame = this._lastFrame; + setTimeout(() => { + if (this._clients.has(client)) + void client.onFrame(frame); + }, 0); + } + return { size: this._size }; + } + removeClient(client) { + const scope = this._clients.get(client); + if (!scope) + return; + this._clients.delete(client); + scope.reject(new Error("Screencast client removed")); + if (!this._clients.size) + this._stopScreencast(); + } + _startScreencast(size, quality) { + this._size = size; + if (!this._size) { + const viewport = this.page.browserContext._options.viewport || { width: 800, height: 600 }; + const scale = Math.min(1, 800 / Math.max(viewport.width, viewport.height)); + this._size = { + width: Math.floor(viewport.width * scale), + height: Math.floor(viewport.height * scale) + }; + } + this._size = { + width: this._size.width & ~1, + height: this._size.height & ~1 + }; + this.page.delegate.startScreencast({ + width: this._size.width, + height: this._size.height, + quality: quality ?? 90 + }); + } + _stopScreencast() { + this._lastFrame = void 0; + this.page.delegate.stopScreencast(); + } + async onScreencastFrame(frame) { + this._lastFrame = frame; + let syncAck = false; + const asyncResults = []; + for (const [client, scope] of this._clients) { + const result2 = client.onFrame(frame); + if (result2) + asyncResults.push(scope.safeRace(result2.catch(() => { + }))); + else + syncAck = true; + } + if (!syncAck && asyncResults.length) + await Promise.race(asyncResults); + } + async onBeforeInputAction(sdkObject, metadata, point, box) { + if (!this._actions) + return; + const page = sdkObject.attribution.page; + if (page !== this.page) + return; + if (!box && sdkObject instanceof ElementHandle) + box = await sdkObject.boundingBox(nullProgress) || void 0; + const actionTitle2 = renderTitleForCall(metadata); + const utility = await page.mainFrame().utilityContext(); + await utility.evaluate(async (options) => { + const { injected, duration } = options; + injected.setScreencastAnnotation(options); + await new Promise((f) => injected.utils.builtins.setTimeout(f, duration)); + injected.setScreencastAnnotation(null); + }, { + injected: await utility.injectedScript(), + duration: this._actions?.duration ?? 500, + point, + box, + actionTitle: actionTitle2, + position: this._actions?.position, + fontSize: this._actions?.fontSize, + cursor: this._actions?.cursor ?? "pointer" + }).catch((e) => debugLogger.log("error", e)); + } + }; + } +}); + +// packages/playwright-core/src/server/page.ts +async function ariaSnapshotForFrame(progress2, frame, selector, options = {}) { + const snapshot3 = await frame.retryWithProgressAndTimeouts(progress2, [1e3, 2e3, 4e3, 8e3], async (progress3, continuePolling) => { + try { + const resolved = await progress3.race(frame.selectors.callOnSelector(selector || "body,frameset", { strict: options.strict ?? !!selector }, ({ injected, elements }, ariaOptions) => { + return injected.ariaSnapshotWithRefs(elements[0], ariaOptions); + }, { + mode: options.mode ?? "default", + doNotRenderActive: options.doNotRenderActive, + depth: options.depth, + boxes: options.boxes + })); + if (!resolved) { + if (selector) + throw new NonRecoverableDOMError(`Selector "${selector}" does not match any element`); + return continuePolling; + } + return { ...resolved.result, resolvedFrame: resolved.frame }; + } catch (e) { + if (frame.isNonRetriableError(e)) + throw e; + return continuePolling; + } + }); + const renderedIframeRefs = snapshot3.iframeRefs.filter((ref) => ref in snapshot3.iframeDepths); + progress2.setAllowConcurrentOrNestedRaces(true); + const childSnapshotPromises = renderedIframeRefs.map(async (ref) => { + const childDepth = options.depth ? options.depth - snapshot3.iframeDepths[ref] - 1 : void 0; + const frameRootSelector = `aria-ref=${ref} >> internal:control=enter-frame >> body,frameset`; + try { + return await ariaSnapshotForFrame(progress2, snapshot3.resolvedFrame, frameRootSelector, { ...options, depth: childDepth, strict: false }); + } catch { + return []; + } + }); + const childSnapshots = await Promise.all(childSnapshotPromises); + progress2.setAllowConcurrentOrNestedRaces(false); + const lines = []; + for (const line of snapshot3.text.split("\n")) { + const match = line.match(/^(\s*)- iframe (?:\[active\] )?\[ref=([^\]]*)\]/); + if (!match) { + lines.push(line); + continue; + } + const leadingSpace = match[1]; + const ref = match[2]; + const childSnapshot = childSnapshots[renderedIframeRefs.indexOf(ref)] ?? []; + lines.push(childSnapshot.length ? line + ":" : line); + lines.push(...childSnapshot.map((l) => leadingSpace + " " + l)); + } + return lines; +} +function ensureArrayLimit(array, limit) { + if (array.length > limit) + return array.splice(0, limit / 10); + return []; +} +var PageEvent, navigationMarkSymbol, Page, WorkerEvent, Worker, PageBinding, InitScript; +var init_page = __esm({ + "packages/playwright-core/src/server/page.ts"() { + "use strict"; + init_selectorParser(); + init_manualPromise(); + init_utilityScriptSerializers(); + init_comparators(); + init_debugLogger(); + init_manualPromise(); + init_assert(); + init_stringUtils(); + init_locatorGenerators(); + init_browserContext(); + init_disposable2(); + init_console(); + init_errors(); + init_fileChooser(); + init_frames(); + init_helper(); + init_input(); + init_instrumentation(); + init_javascript(); + init_screenshotter(); + init_callLog(); + init_bindingsControllerSource(); + init_overlay(); + init_dom(); + init_screencast(); + init_javascript(); + PageEvent = { + Close: "close", + Crash: "crash", + Download: "download", + EmulatedSizeChanged: "emulatedsizechanged", + FileChooser: "filechooser", + FrameAttached: "frameattached", + FrameDetached: "framedetached", + InternalFrameNavigatedToNewDocument: "internalframenavigatedtonewdocument", + LocatorHandlerTriggered: "locatorhandlertriggered", + WebSocket: "websocket", + Worker: "worker" + }; + navigationMarkSymbol = /* @__PURE__ */ Symbol("navigationMark"); + Page = class _Page extends SdkObject { + constructor(delegate, browserContext) { + super(browserContext, "page"); + this._lifecycle = "open"; + this.closedPromise = new ManualPromise(); + this._initializedPromise = new ManualPromise(); + this._consoleMessages = []; + this._pageErrors = []; + this.openScope = new LongStandingScope(); + this._emulatedMedia = {}; + this._fileChooserInterceptedBy = /* @__PURE__ */ new Set(); + this._pageBindings = /* @__PURE__ */ new Map(); + this.initScripts = []; + this._workers = /* @__PURE__ */ new Map(); + this.requestInterceptors = []; + this._locatorHandlers = /* @__PURE__ */ new Map(); + this._lastLocatorHandlerUid = 0; + this._locatorHandlerRunningCounter = 0; + this._networkRequests = []; + this.attribution.page = this; + this.delegate = delegate; + this.browserContext = browserContext; + this.keyboard = new Keyboard(delegate.rawKeyboard, this); + this.mouse = new Mouse(delegate.rawMouse, this); + this.touchscreen = new Touchscreen(delegate.rawTouchscreen, this); + this.screenshotter = new Screenshotter(this); + this.frameManager = new FrameManager(this); + this.overlay = new Overlay(this); + this.screencast = new Screencast(this); + if (delegate.pdf) + this.pdf = delegate.pdf.bind(delegate); + this.coverage = delegate.coverage ? delegate.coverage() : null; + this.isStorageStatePage = browserContext.isCreatingStorageStatePage(); + } + static { + this.Events = PageEvent; + } + async reportAsNew(opener, error) { + if (this.delegate.noUtilityWorld?.()) { + await this._addInitScript(saveGlobalsSnapshotSource); + await this.safeNonStallingEvaluateInAllFrames(saveGlobalsSnapshotSource, "main"); + } + if (opener) { + const openerPageOrError = await opener.waitForInitializedOrError(); + if (openerPageOrError instanceof _Page && !openerPageOrError.isClosedOrClosingOrCrashed()) + this._opener = openerPageOrError; + } + this._markInitialized(error); + } + _markInitialized(error = void 0) { + if (error) { + if (this.browserContext.isClosingOrClosed()) + return; + this.frameManager.createDummyMainFrameIfNeeded(); + } + this._initialized = error || this; + this.emitOnContext(BrowserContext.Events.Page, this); + for (const pageError of this._pageErrors) + this.emitOnContext(BrowserContext.Events.PageError, pageError, this); + for (const message of this._consoleMessages) + this.emitOnContext(BrowserContext.Events.Console, message); + if (this.isClosed()) + this.emit(_Page.Events.Close); + else + this.instrumentation.onPageOpen(this); + this._initializedPromise.resolve(this._initialized); + } + initializedOrUndefined() { + return this._initialized ? this : void 0; + } + waitForInitializedOrError() { + return this._initializedPromise; + } + emitOnContext(event, ...args) { + if (this.isStorageStatePage) + return; + this.browserContext.emit(event, ...args); + } + async resetForReuse(progress2) { + await this.mainFrame().gotoImpl(progress2, "about:blank", {}); + this._emulatedSize = void 0; + this._emulatedMedia = {}; + this._extraHTTPHeaders = void 0; + await progress2.race(Promise.all([ + this.delegate.updateEmulatedViewportSize(), + this.delegate.updateEmulateMedia(), + this.delegate.updateExtraHTTPHeaders() + ])); + await this.delegate.resetForReuse(progress2); + } + _didDisconnect(error) { + if (this.openScope.isClosed()) + return; + this.frameManager.dispose(error); + this.screencast.dispose(); + this.overlay.dispose(); + this.openScope.close(error); + } + _didClose() { + if (this._lifecycle === "closed") + return; + this._lifecycle = "closed"; + this._didDisconnect(new TargetClosedError(this.closeReason())); + this.emit(_Page.Events.Close); + this.browserContext.emit(BrowserContext.Events.PageClosed, this); + this.closedPromise.resolve(); + this.instrumentation.onPageClose(this); + } + _didCrash() { + if (this._lifecycle !== "open") + return; + this._lifecycle = "crashed"; + this._didDisconnect(new TargetClosedError("Page crashed")); + this.emit(_Page.Events.Crash); + } + async _onFileChooserOpened(handle) { + let multiple; + try { + multiple = await handle.evaluate((element3) => !!element3.multiple); + } catch (e) { + return; + } + if (!this.listenerCount(_Page.Events.FileChooser)) { + handle.dispose(); + return; + } + const fileChooser = new FileChooser(handle, multiple); + this.emit(_Page.Events.FileChooser, fileChooser); + } + opener() { + return this._opener; + } + mainFrame() { + return this.frameManager.mainFrame(); + } + frames() { + return this.frameManager.frames(); + } + async exposeBinding(progress2, name, playwrightBinding, noGlobal) { + if (this._pageBindings.has(name)) + throw new Error(`Function "${name}" has been already registered`); + if (this.browserContext._pageBindings.has(name)) + throw new Error(`Function "${name}" has been already registered in the browser context`); + await progress2.race(this.browserContext.exposePlaywrightBindingIfNeeded()); + const binding = new PageBinding(this, name, playwrightBinding, noGlobal); + this._pageBindings.set(name, binding); + try { + await progress2.race(this.delegate.addInitScript(binding.initScript)); + await progress2.race(this.safeNonStallingEvaluateInAllFrames(binding.initScript.source, "main")); + return binding; + } catch (error) { + this._pageBindings.delete(name); + throw error; + } + } + async removeExposedBinding(binding) { + if (this._pageBindings.get(binding.name) !== binding) + return; + this._pageBindings.delete(binding.name); + await this.delegate.removeInitScripts([binding.initScript]); + const cleanup = `{ ${binding.cleanupScript} };`; + await this.safeNonStallingEvaluateInAllFrames(cleanup, "main"); + } + async setExtraHTTPHeaders(progress2, headers) { + const oldHeaders = this._extraHTTPHeaders; + try { + this._extraHTTPHeaders = headers; + await progress2.race(this.delegate.updateExtraHTTPHeaders()); + } catch (error) { + this._extraHTTPHeaders = oldHeaders; + this.delegate.updateExtraHTTPHeaders().catch(() => { + }); + throw error; + } + } + extraHTTPHeaders() { + return this._extraHTTPHeaders; + } + addNetworkRequest(request2) { + this._networkRequests.push(request2); + ensureArrayLimit(this._networkRequests, 100); + } + networkRequests() { + return this._networkRequests; + } + async onBindingCalled(payload, context2) { + if (this.isClosedOrClosingOrCrashed()) + return; + await PageBinding.dispatch(this, payload, context2); + } + addConsoleMessage(worker, type3, args, location2, text2, timestamp) { + const message = new ConsoleMessage(this, worker, type3, text2, args, location2, timestamp); + const intercepted = this.frameManager.interceptConsoleMessage(message); + if (intercepted) { + args.forEach((arg) => arg.dispose()); + return; + } + this._consoleMessages.push(message); + ensureArrayLimit(this._consoleMessages, 200); + if (this._initialized) + this.emitOnContext(BrowserContext.Events.Console, message); + } + clearConsoleMessages() { + this._consoleMessages.length = 0; + } + consoleMessages(filter) { + if (filter === "all") + return this._consoleMessages; + const marked = this._consoleMessages.findLastIndex((m) => m[navigationMarkSymbol]); + return marked === -1 ? this._consoleMessages : this._consoleMessages.slice(marked + 1); + } + addPageError(error, location2) { + const pageError = { error, location: location2 }; + this._pageErrors.push(pageError); + ensureArrayLimit(this._pageErrors, 200); + if (this._initialized) + this.emitOnContext(BrowserContext.Events.PageError, pageError, this); + } + clearPageErrors() { + this._pageErrors.length = 0; + } + pageErrors(filter) { + if (filter === "all") + return this._pageErrors.map((e) => e.error); + const marked = this._pageErrors.findLastIndex((e) => e[navigationMarkSymbol]); + return (marked === -1 ? this._pageErrors : this._pageErrors.slice(marked + 1)).map((e) => e.error); + } + async reload(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + const [response2] = await Promise.all([ + // Reload must be a new document, and should not be confused with a stray pushState. + this.mainFrame().waitForNavigation(progress2, true, options), + progress2.race(this.delegate.reload()) + ]); + return response2; + }); + } + async goBack(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + let error; + const waitPromise = this.mainFrame().waitForNavigation(progress2, false, options).catch((e) => { + error = e; + return null; + }); + const result2 = await progress2.race(this.delegate.goBack()); + if (!result2) { + waitPromise.catch(() => { + }); + return null; + } + const response2 = await waitPromise; + if (error) + throw error; + return response2; + }); + } + async goForward(progress2, options) { + return this.mainFrame().raceNavigationAction(progress2, async () => { + let error; + const waitPromise = this.mainFrame().waitForNavigation(progress2, false, options).catch((e) => { + error = e; + return null; + }); + const result2 = await progress2.race(this.delegate.goForward()); + if (!result2) { + waitPromise.catch(() => { + }); + return null; + } + const response2 = await waitPromise; + if (error) + throw error; + return response2; + }); + } + requestGC(progress2) { + return progress2.race(this.delegate.requestGC()); + } + registerLocatorHandler(selector, noWaitAfter) { + const uid = ++this._lastLocatorHandlerUid; + this._locatorHandlers.set(uid, { selector, noWaitAfter }); + return uid; + } + resolveLocatorHandler(uid, remove) { + const handler = this._locatorHandlers.get(uid); + if (remove) + this._locatorHandlers.delete(uid); + if (handler) { + handler.resolved?.resolve(); + handler.resolved = void 0; + } + } + unregisterLocatorHandler(uid) { + this._locatorHandlers.delete(uid); + } + async performActionPreChecks(progress2) { + await this._performWaitForNavigationCheck(progress2); + await this._performLocatorHandlersCheckpoint(progress2); + await this._performWaitForNavigationCheck(progress2); + } + async _performWaitForNavigationCheck(progress2) { + if (process.env.PLAYWRIGHT_SKIP_NAVIGATION_CHECK) + return; + const mainFrame = this.frameManager.mainFrame(); + if (!mainFrame || !mainFrame.pendingDocument()) + return; + const url3 = mainFrame.pendingDocument()?.request?.url(); + const toUrl = url3 ? ` "${trimStringWithEllipsis(url3, 200)}"` : ""; + progress2.log(` waiting for${toUrl} navigation to finish...`); + await helper.waitForEvent(progress2, mainFrame, Frame.Events.InternalNavigation, (e) => { + if (!e.isPublic) + return false; + if (!e.error) + progress2.log(` navigated to "${trimStringWithEllipsis(mainFrame.url(), 200)}"`); + return true; + }).promise; + } + async _performLocatorHandlersCheckpoint(progress2) { + if (this._locatorHandlerRunningCounter) + return; + for (const [uid, handler] of this._locatorHandlers) { + if (!handler.resolved) { + if (await this.mainFrame().isVisibleInternal(progress2, handler.selector, { strict: true })) { + handler.resolved = new ManualPromise(); + this.emit(_Page.Events.LocatorHandlerTriggered, uid); + } + } + if (handler.resolved) { + ++this._locatorHandlerRunningCounter; + progress2.log(` found ${asLocator(this.browserContext._browser.sdkLanguage(), handler.selector)}, intercepting action to run the handler`); + const promise = handler.resolved.then(async () => { + if (!handler.noWaitAfter) { + progress2.log(` locator handler has finished, waiting for ${asLocator(this.browserContext._browser.sdkLanguage(), handler.selector)} to be hidden`); + await this.mainFrame().waitForSelector(progress2, handler.selector, false, { state: "hidden" }); + } else { + progress2.log(` locator handler has finished`); + } + }); + try { + progress2.setAllowConcurrentOrNestedRaces(true); + await progress2.race(this.openScope.race(promise)); + } finally { + progress2.setAllowConcurrentOrNestedRaces(false); + --this._locatorHandlerRunningCounter; + } + progress2.log(` interception handler has finished, continuing`); + } + } + } + async emulateMedia(progress2, options) { + const oldEmulatedMedia = { ...this._emulatedMedia }; + if (options.media !== void 0) + this._emulatedMedia.media = options.media; + if (options.colorScheme !== void 0) + this._emulatedMedia.colorScheme = options.colorScheme; + if (options.reducedMotion !== void 0) + this._emulatedMedia.reducedMotion = options.reducedMotion; + if (options.forcedColors !== void 0) + this._emulatedMedia.forcedColors = options.forcedColors; + if (options.contrast !== void 0) + this._emulatedMedia.contrast = options.contrast; + try { + await progress2.race(this.delegate.updateEmulateMedia()); + } catch (error) { + this._emulatedMedia = oldEmulatedMedia; + this.delegate.updateEmulateMedia().catch(() => { + }); + throw error; + } + } + emulatedMedia() { + const contextOptions = this.browserContext._options; + return { + media: this._emulatedMedia.media || "no-override", + colorScheme: this._emulatedMedia.colorScheme !== void 0 ? this._emulatedMedia.colorScheme : contextOptions.colorScheme ?? "light", + reducedMotion: this._emulatedMedia.reducedMotion !== void 0 ? this._emulatedMedia.reducedMotion : contextOptions.reducedMotion ?? "no-preference", + forcedColors: this._emulatedMedia.forcedColors !== void 0 ? this._emulatedMedia.forcedColors : contextOptions.forcedColors ?? "none", + contrast: this._emulatedMedia.contrast !== void 0 ? this._emulatedMedia.contrast : contextOptions.contrast ?? "no-preference" + }; + } + async setViewportSize(progress2, viewportSize) { + const oldEmulatedSize = this._emulatedSize; + try { + this._setEmulatedSize({ viewport: { ...viewportSize }, screen: { ...viewportSize } }); + await progress2.race(this.delegate.updateEmulatedViewportSize()); + } catch (error) { + this._emulatedSize = oldEmulatedSize; + this.delegate.updateEmulatedViewportSize().catch(() => { + }); + throw error; + } + } + setEmulatedSizeFromWindowOpen(emulatedSize) { + this._setEmulatedSize(emulatedSize); + } + _setEmulatedSize(emulatedSize) { + this._emulatedSize = emulatedSize; + this.emit(_Page.Events.EmulatedSizeChanged); + } + emulatedSize() { + if (this._emulatedSize) + return this._emulatedSize; + const contextOptions = this.browserContext._options; + return contextOptions.viewport ? { viewport: contextOptions.viewport, screen: contextOptions.screen || contextOptions.viewport } : void 0; + } + async bringToFront(progress2) { + await progress2.race(this.delegate.bringToFront()); + } + async addInitScript(progress2, source12) { + return await progress2.race(this._addInitScript(source12)); + } + async _addInitScript(source12) { + const initScript = new InitScript(this, source12); + this.initScripts.push(initScript); + try { + await this.delegate.addInitScript(initScript); + } catch (error) { + initScript.dispose().catch(() => { + }); + throw error; + } + return initScript; + } + async removeInitScript(initScript) { + this.initScripts = this.initScripts.filter((script) => initScript !== script); + await this.delegate.removeInitScripts([initScript]); + } + needsRequestInterception() { + return this.requestInterceptors.length > 0 || this.browserContext.requestInterceptors.length > 0; + } + async addRequestInterceptor(progress2, handler, prepend) { + if (prepend) + this.requestInterceptors.unshift(handler); + else + this.requestInterceptors.push(handler); + await progress2.race(this.delegate.updateRequestInterception()); + } + async removeRequestInterceptor(handler) { + const index = this.requestInterceptors.indexOf(handler); + if (index === -1) + return; + this.requestInterceptors.splice(index, 1); + await this.browserContext.notifyRoutesInFlightAboutRemovedHandler(handler); + await this.delegate.updateRequestInterception(); + } + async expectScreenshot(progress2, options) { + const locator2 = options.locator; + const rafrafScreenshot = locator2 ? async (progress3, timeout) => { + return await locator2.frame.rafrafTimeoutScreenshotElementWithProgress(progress3, locator2.selector, timeout, options || {}); + } : async (progress3, timeout) => { + await this.performActionPreChecks(progress3); + await this.mainFrame().rafrafTimeout(progress3, timeout); + return await this.screenshotter.screenshotPage(progress3, options || {}); + }; + let intermediateResult; + try { + if (!options.expected && options.isNot) + throw new Error('"not" matcher requires expected result'); + const format2 = validateScreenshotOptions(options || {}); + const comparator = getComparator(`image/${format2}`); + const areEqualScreenshots = (actual2, expected, previous2) => { + const comparatorResult = actual2 && expected ? comparator(actual2, expected, options) : void 0; + if (comparatorResult !== void 0 && !!comparatorResult === !!options.isNot) + return true; + if (comparatorResult) + intermediateResult = { errorMessage: comparatorResult.errorMessage, diff: comparatorResult.diff, actual: actual2, previous: previous2 }; + return false; + }; + let actual; + let previous; + const pollIntervals = [0, 100, 250, 500]; + if (options.expected) + progress2.log(` verifying given screenshot expectation`); + else + progress2.log(` generating new stable screenshot expectation`); + let isFirstIteration = true; + while (true) { + if (this.isClosed()) + throw new Error("The page has closed"); + const screenshotTimeout = pollIntervals.shift() ?? 1e3; + if (screenshotTimeout) + progress2.log(`waiting ${screenshotTimeout}ms before taking screenshot`); + previous = actual; + actual = await rafrafScreenshot(progress2, screenshotTimeout).catch((e) => { + if (this.mainFrame().isNonRetriableError(e)) + throw e; + progress2.log(`failed to take screenshot - ` + e.message); + return void 0; + }); + if (!actual) + continue; + const expectation = options.expected && isFirstIteration ? options.expected : previous; + if (areEqualScreenshots(actual, expectation, previous)) + break; + if (intermediateResult) + progress2.log(intermediateResult.errorMessage); + isFirstIteration = false; + } + if (!isFirstIteration) + progress2.log(`captured a stable screenshot`); + if (!options.expected) + return { actual }; + if (isFirstIteration) { + progress2.log(`screenshot matched expectation`); + return {}; + } + if (areEqualScreenshots(actual, options.expected, void 0)) { + progress2.log(`screenshot matched expectation`); + return {}; + } + throw new Error(intermediateResult.errorMessage); + } catch (e) { + if (isJavaScriptErrorInEvaluate(e) || isInvalidSelectorError(e)) + throw e; + let errorMessage = e.message; + if (e instanceof TimeoutError && intermediateResult?.previous) + errorMessage = `Failed to take two consecutive stable screenshots.`; + const details = { + log: compressCallLog(e.message ? [...progress2.metadata.log, e.message] : progress2.metadata.log), + actual: intermediateResult?.actual, + previous: intermediateResult?.previous, + diff: intermediateResult?.diff, + timedOut: e instanceof TimeoutError, + customErrorMessage: errorMessage + }; + const error = new Error("Expect failed"); + error.details = details; + throw error; + } + } + async screenshot(progress2, options) { + return await this.screenshotter.screenshotPage(progress2, options); + } + async close(progress2, options = {}) { + await progress2.race(this._close(options)); + } + async _close(options = {}) { + if (this._lifecycle === "closed") + return; + if (options.reason) + this._closeReason = options.reason; + await this.screencast.handlePageOrContextClose(); + if (this._lifecycle !== "closing") { + this._lifecycle = "closing"; + const closePage = this._customCloseHandler ?? ((runBeforeUnload) => this.delegate.closePage(runBeforeUnload)); + await closePage(false).catch((e) => debugLogger.log("error", e)); + } + await this.closedPromise; + } + setCustomCloseHandler(handler) { + this._customCloseHandler = handler; + } + async runBeforeUnload(progress2) { + await progress2.race(this._runBeforeUnload()); + } + async _runBeforeUnload() { + const closePage = this._customCloseHandler ?? ((runBeforeUnload) => this.delegate.closePage(runBeforeUnload)); + await closePage(true).catch((e) => debugLogger.log("error", e)); + } + isClosed() { + return this._lifecycle === "closed"; + } + isClosedOrClosingOrCrashed() { + return this._lifecycle !== "open"; + } + addWorker(workerId, worker) { + this._workers.set(workerId, worker); + this.emit(_Page.Events.Worker, worker); + } + removeWorker(workerId) { + const worker = this._workers.get(workerId); + if (!worker) + return; + worker.didClose(); + this._workers.delete(workerId); + } + clearWorkers() { + for (const [workerId, worker] of this._workers) { + worker.didClose(); + this._workers.delete(workerId); + } + } + async setFileChooserInterceptedBy(progress2, enabled, by) { + await progress2.race(this._setFileChooserInterceptedBy(enabled, by)); + } + async _setFileChooserInterceptedBy(enabled, by) { + const wasIntercepted = this.fileChooserIntercepted(); + if (enabled) + this._fileChooserInterceptedBy.add(by); + else + this._fileChooserInterceptedBy.delete(by); + if (wasIntercepted !== this.fileChooserIntercepted()) + await this.delegate.updateFileChooserInterception(); + } + fileChooserIntercepted() { + return this._fileChooserInterceptedBy.size > 0; + } + frameNavigatedToNewDocument(frame) { + this.emit(_Page.Events.InternalFrameNavigatedToNewDocument, frame); + this.browserContext.emit(BrowserContext.Events.InternalFrameNavigatedToNewDocument, frame); + const origin = frame.origin(); + if (origin) + this.browserContext.addVisitedOrigin(origin); + if (frame === this.mainFrame()) { + if (this._consoleMessages.length > 0) + this._consoleMessages[this._consoleMessages.length - 1][navigationMarkSymbol] = true; + if (this._pageErrors.length > 0) + this._pageErrors[this._pageErrors.length - 1][navigationMarkSymbol] = true; + } + } + allInitScripts() { + const bindings = [...this.browserContext._pageBindings.values(), ...this._pageBindings.values()].map((binding) => binding.initScript); + if (this.browserContext.bindingsInitScript) + bindings.unshift(this.browserContext.bindingsInitScript); + return [...bindings, ...this.browserContext.initScripts, ...this.initScripts]; + } + getBinding(name) { + return this._pageBindings.get(name) || this.browserContext._pageBindings.get(name); + } + async safeNonStallingEvaluateInAllFrames(expression2, world, options = {}) { + await Promise.all(this.frames().map(async (frame) => { + try { + await frame.nonStallingEvaluateInExistingContext(expression2, world); + } catch (e) { + if (options.throwOnJSErrors && isJavaScriptErrorInEvaluate(e)) + throw e; + } + })); + } + async hideHighlight() { + await Promise.all(this.frames().map((frame) => frame.hideHighlight().catch(() => { + }))); + } + async setDockTile(image) { + await this.delegate.setDockTile(image); + } + async webStorageItems(progress2, kind) { + const storage = `${kind}Storage`; + return await this.mainFrame().evaluateExpression(progress2, `(() => { + const result = []; + for (let i = 0; i < ${storage}.length; i++) { + const name = ${storage}.key(i); + if (name !== null) + result.push({ name, value: ${storage}.getItem(name) ?? '' }); + } + return result; + })()`, { world: "utility" }); + } + async webStorageGetItem(progress2, kind, name) { + const value2 = await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.getItem(${JSON.stringify(name)})`, { world: "utility" }); + return value2 === null ? void 0 : value2; + } + async webStorageSetItem(progress2, kind, name, value2) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.setItem(${JSON.stringify(name)}, ${JSON.stringify(value2)})`, { world: "utility" }); + } + async webStorageRemoveItem(progress2, kind, name) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.removeItem(${JSON.stringify(name)})`, { world: "utility" }); + } + async webStorageClear(progress2, kind) { + await this.mainFrame().evaluateExpression(progress2, `${kind}Storage.clear()`, { world: "utility" }); + } + }; + WorkerEvent = { + Console: "console", + Close: "close" + }; + Worker = class _Worker extends SdkObject { + constructor(parent, url3, onDisconnect) { + super(parent, "worker"); + this._executionContextPromise = new ManualPromise(); + this._workerScriptLoaded = false; + this.existingExecutionContext = null; + this.openScope = new LongStandingScope(); + this.attribution.worker = this; + this.url = url3; + this._onDisconnect = onDisconnect; + } + static { + this.Events = WorkerEvent; + } + createExecutionContext(delegate) { + this.existingExecutionContext = new ExecutionContext(this, delegate, "worker"); + if (this._workerScriptLoaded) + this._executionContextPromise.resolve(this.existingExecutionContext); + return this.existingExecutionContext; + } + destroyExecutionContext(errorMessage) { + if (this.existingExecutionContext) + this.existingExecutionContext.contextDestroyed(errorMessage); + this.existingExecutionContext = null; + this._workerScriptLoaded = false; + this._executionContextPromise = new ManualPromise(); + } + workerScriptLoaded() { + this._workerScriptLoaded = true; + if (this.existingExecutionContext) + this._executionContextPromise.resolve(this.existingExecutionContext); + } + didClose() { + if (this.existingExecutionContext) + this.existingExecutionContext.contextDestroyed("Worker was closed"); + this.emit(_Worker.Events.Close, this); + this.openScope.close(new Error("Worker closed")); + } + async evaluateExpression(progress2, expression2, isFunction2, arg) { + return progress2.race(evaluateExpression(await this._executionContextPromise, expression2, { returnByValue: true, isFunction: isFunction2 }, arg)); + } + async evaluateExpressionHandle(progress2, expression2, isFunction2, arg) { + return progress2.race(evaluateExpression(await this._executionContextPromise, expression2, { returnByValue: false, isFunction: isFunction2 }, arg)); + } + async disconnect(progress2, options = {}) { + if (!this._onDisconnect) + throw new Error("Cannot disconnect from this worker"); + this._closeReason = options.reason; + await progress2.race(this._onDisconnect()); + } + }; + PageBinding = class _PageBinding extends DisposableObject { + static { + this.kBindingName = "__playwright__binding__"; + } + static createInitScript(browserContext) { + return new InitScript(browserContext, ` + (() => { + const module = {}; + ${source5} + const property = '${kBindingsControllerProperty}'; + if (!globalThis[property]) + globalThis[property] = new (module.exports.BindingsController())(globalThis, '${_PageBinding.kBindingName}'); + })(); + `); + } + constructor(parent, name, playwrightFunction, noGlobal) { + super(parent); + this.name = name; + this.playwrightFunction = playwrightFunction; + this.initScript = new InitScript(parent, `globalThis['${kBindingsControllerProperty}'].addBinding(${JSON.stringify(name)}, ${!!noGlobal})`); + this.cleanupScript = `globalThis['${kBindingsControllerProperty}'].removeBinding(${JSON.stringify(name)})`; + } + static async dispatch(page, payload, context2) { + const { name, seq, serializedArgs } = JSON.parse(payload); + try { + assert(context2.world); + const binding = page.getBinding(name); + if (!binding) + throw new Error(`Function "${name}" is not exposed`); + if (!Array.isArray(serializedArgs)) + throw new Error(`serializedArgs is not an array. This can happen when Array.prototype.toJSON is defined incorrectly`); + const args = serializedArgs.map((a) => parseEvaluationResultValue(a)); + const result2 = await binding.playwrightFunction({ frame: context2.frame, page, context: page.browserContext }, ...args); + context2.evaluateExpressionHandle(`arg => globalThis['${kBindingsControllerProperty}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, result: result2 }).catch((e) => debugLogger.log("error", e)); + } catch (error) { + context2.evaluateExpressionHandle(`arg => globalThis['${kBindingsControllerProperty}'].deliverBindingResult(arg)`, { isFunction: true }, { name, seq, error }).catch((e) => debugLogger.log("error", e)); + } + } + async dispose() { + await this.parent.removeExposedBinding(this); + } + }; + InitScript = class extends DisposableObject { + constructor(owner, source12) { + super(owner); + this.source = `(() => { + ${source12} + })();`; + } + async dispose() { + await this.parent.removeInitScript(this); + } + }; + } +}); + +// packages/playwright-core/src/server/types.ts +var kLifecycleEvents; +var init_types = __esm({ + "packages/playwright-core/src/server/types.ts"() { + "use strict"; + kLifecycleEvents = /* @__PURE__ */ new Set(["load", "domcontentloaded", "networkidle", "commit"]); + } +}); + +// packages/playwright-core/src/server/frames.ts +function verifyLifecycle(name, waitUntil) { + if (waitUntil === "networkidle0") + waitUntil = "networkidle"; + if (!kLifecycleEvents.has(waitUntil)) + throw new Error(`${name}: expected one of (load|domcontentloaded|networkidle|commit)`); + return waitUntil; +} +function renderUnexpectedValue(expression2, received) { + if (expression2 === "to.match.aria") + return received ? received.raw : received; + return received; +} +var yaml, NavigationAbortedError, ExpectError, kDummyFrameId, FrameManager, FrameEvent, Frame, SignalBarrier; +var init_frames = __esm({ + "packages/playwright-core/src/server/frames.ts"() { + "use strict"; + init_ariaSnapshot(); + init_selectorParser(); + init_manualPromise(); + init_eventsHelper(); + init_manualPromise(); + init_locatorGenerators(); + init_assert(); + init_urlMatch(); + init_task(); + init_crypto(); + init_browserContext(); + init_dom(); + init_errors(); + init_fileUploadUtils(); + init_frameSelectors(); + init_helper(); + init_instrumentation(); + init_javascript(); + init_network2(); + init_page(); + init_progress(); + init_types(); + init_protocolError(); + yaml = require("./utilsBundle").yaml; + NavigationAbortedError = class extends Error { + constructor(documentId, message) { + super(message); + this.documentId = documentId; + } + }; + ExpectError = class extends Error { + constructor(details) { + super("Expect failed"); + this.name = "ExpectError"; + this.details = details; + } + }; + kDummyFrameId = ""; + FrameManager = class { + constructor(page) { + this._frames = /* @__PURE__ */ new Map(); + this._consoleMessageTags = /* @__PURE__ */ new Map(); + this._signalBarriers = /* @__PURE__ */ new Set(); + this._webSockets = /* @__PURE__ */ new Map(); + this._nextFrameSeq = 0; + this._page = page; + this._mainFrame = void 0; + } + _allocateFrameSeq() { + return this._nextFrameSeq++; + } + createDummyMainFrameIfNeeded() { + if (!this._mainFrame) + this.frameAttached(kDummyFrameId, null); + } + dispose(error) { + for (const frame of this._frames.values()) { + frame._stopNetworkIdleTimer(); + frame.invalidateNonStallingEvaluations(error); + } + } + mainFrame() { + return this._mainFrame; + } + frames() { + const frames = []; + collect(this._mainFrame); + return frames; + function collect(frame) { + frames.push(frame); + for (const subframe of frame._getChildFrames()) + collect(subframe); + } + } + frame(frameId) { + return this._frames.get(frameId) || null; + } + frameAttached(frameId, parentFrameId) { + const parentFrame = parentFrameId ? this._frames.get(parentFrameId) : null; + if (!parentFrame) { + if (this._mainFrame) { + this._frames.delete(this._mainFrame._id); + this._mainFrame._id = frameId; + } else { + assert(!this._frames.has(frameId)); + this._mainFrame = new Frame(this._page, frameId, parentFrame); + } + this._frames.set(frameId, this._mainFrame); + return this._mainFrame; + } else { + assert(!this._frames.has(frameId)); + const frame = new Frame(this._page, frameId, parentFrame); + this._frames.set(frameId, frame); + this._page.emit(Page.Events.FrameAttached, frame); + this._page.browserContext.emit(BrowserContext.Events.FrameAttached, frame); + return frame; + } + } + async waitForSignalsCreatedBy(progress2, waitAfter, action) { + if (!waitAfter) + return action(progress2); + const barrier = new SignalBarrier(progress2); + this._signalBarriers.add(barrier); + try { + const result2 = await action(progress2); + await progress2.race(this._page.delegate.inputActionEpilogue()); + await barrier.waitFor(progress2); + await new Promise(makeWaitForNextTask()); + return result2; + } finally { + this._signalBarriers.delete(barrier); + } + } + frameWillPotentiallyRequestNavigation() { + for (const barrier of this._signalBarriers) + barrier.retain(); + } + frameDidPotentiallyRequestNavigation() { + for (const barrier of this._signalBarriers) + barrier.release(); + } + frameRequestedNavigation(frameId, documentId) { + const frame = this._frames.get(frameId); + if (!frame) + return; + for (const barrier of this._signalBarriers) + barrier.addFrameNavigation(frame); + if (frame.pendingDocument() && frame.pendingDocument().documentId === documentId) { + return; + } + const request2 = documentId ? Array.from(frame._inflightRequests).find((request3) => request3._documentId === documentId) : void 0; + frame._setPendingDocument({ documentId, request: request2 }); + } + frameCommittedNewDocumentNavigation(frameId, url3, name, documentId, initial) { + const frame = this._frames.get(frameId); + this.removeChildFramesRecursively(frame); + this._clearWebSockets(frame); + const previousUrl = frame._url; + frame._url = url3; + frame._name = name; + let keepPending; + const pendingDocument = frame.pendingDocument(); + if (pendingDocument) { + if (pendingDocument.documentId === void 0) { + pendingDocument.documentId = documentId; + } + if (pendingDocument.documentId === documentId) { + frame._currentDocument = pendingDocument; + } else { + keepPending = pendingDocument; + frame._currentDocument = { documentId, request: void 0 }; + } + frame._setPendingDocument(void 0); + } else { + frame._currentDocument = { documentId, request: void 0 }; + } + frame._onClearLifecycle(); + const navigationEvent = { url: url3, name, newDocument: frame._currentDocument, isPublic: true }; + this._fireInternalFrameNavigation(frame, navigationEvent); + if (!initial) { + frame.apiLog(` navigated to "${url3}"`); + this._page.frameNavigatedToNewDocument(frame); + if (frame === this._mainFrame && previousUrl && previousUrl !== "about:blank") + frame.seq = this._allocateFrameSeq(); + } + frame._setPendingDocument(keepPending); + } + frameCommittedSameDocumentNavigation(frameId, url3) { + const frame = this._frames.get(frameId); + if (!frame) + return; + const pending = frame.pendingDocument(); + if (pending && pending.documentId === void 0 && pending.request === void 0) { + frame._setPendingDocument(void 0); + } + frame._url = url3; + const navigationEvent = { url: url3, name: frame._name, isPublic: true }; + this._fireInternalFrameNavigation(frame, navigationEvent); + frame.apiLog(` navigated to "${url3}"`); + } + frameAbortedNavigation(frameId, errorText, documentId) { + const frame = this._frames.get(frameId); + if (!frame || !frame.pendingDocument()) + return; + if (documentId !== void 0 && frame.pendingDocument().documentId !== documentId) + return; + const navigationEvent = { + url: frame._url, + name: frame._name, + newDocument: frame.pendingDocument(), + error: new NavigationAbortedError(documentId, errorText), + isPublic: !(documentId && frame._redirectedNavigations.has(documentId)) + }; + frame._setPendingDocument(void 0); + this._fireInternalFrameNavigation(frame, navigationEvent); + } + frameDetached(frameId) { + const frame = this._frames.get(frameId); + if (frame) { + this._removeFramesRecursively(frame); + this._page.mainFrame()._recalculateNetworkIdle(); + } + } + frameLifecycleEvent(frameId, event) { + const frame = this._frames.get(frameId); + if (frame) + frame.onLifecycleEvent(event); + } + requestStarted(request2, route2) { + const frame = request2.frame(); + this._inflightRequestStarted(request2); + if (frame && request2._documentId) + frame._setPendingDocument({ documentId: request2._documentId, request: request2 }); + if (request2._isFavicon) { + route2?.abort("aborted").catch(() => { + }); + return; + } + this._page.addNetworkRequest(request2); + this._page.emitOnContext(BrowserContext.Events.Request, request2); + if (route2) + new Route(request2, route2).handle([...this._page.requestInterceptors, ...this._page.browserContext.requestInterceptors]); + } + requestReceivedResponse(response2) { + if (response2.request()._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.Response, response2); + } + reportRequestFinished(request2, response2) { + this._inflightRequestFinished(request2); + if (request2._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.RequestFinished, { request: request2, response: response2 }); + } + requestFailed(request2, canceled) { + const frame = request2.frame(); + this._inflightRequestFinished(request2); + if (frame && frame.pendingDocument() && frame.pendingDocument().request === request2) { + let errorText = request2.failure().errorText; + if (canceled) + errorText += "; maybe frame was detached?"; + this.frameAbortedNavigation(frame._id, errorText, frame.pendingDocument().documentId); + } + if (request2._isFavicon) + return; + this._page.emitOnContext(BrowserContext.Events.RequestFailed, request2); + } + removeChildFramesRecursively(frame) { + for (const child of frame._getChildFrames()) + this._removeFramesRecursively(child); + } + _removeFramesRecursively(frame) { + this.removeChildFramesRecursively(frame); + frame._onDetached(); + this._frames.delete(frame._id); + if (!this._page.isClosed()) + this._page.emit(Page.Events.FrameDetached, frame); + } + _inflightRequestFinished(request2) { + const frame = request2.frame(); + if (this._isExcludedFromNetworkIdle(request2) || !frame) + return; + if (!frame._inflightRequests.has(request2)) + return; + frame._inflightRequests.delete(request2); + if (frame._inflightRequests.size === 0) + frame._startNetworkIdleTimer(); + } + _inflightRequestStarted(request2) { + const frame = request2.frame(); + if (this._isExcludedFromNetworkIdle(request2) || !frame) + return; + frame._inflightRequests.add(request2); + if (frame._inflightRequests.size === 1) + frame._stopNetworkIdleTimer(); + } + _isExcludedFromNetworkIdle(request2) { + if (request2._isFavicon) + return true; + if (request2.resourceType() === "eventsource") + return true; + return false; + } + interceptConsoleMessage(message) { + if (message.type() !== "debug") + return false; + const tag = message.text(); + const handler = this._consoleMessageTags.get(tag); + if (!handler) + return false; + this._consoleMessageTags.delete(tag); + handler(); + return true; + } + _clearWebSockets(frame) { + if (frame.parentFrame()) + return; + this._webSockets.clear(); + } + onWebSocketCreated(requestId, url3) { + const ws4 = new WebSocket(this._page, url3); + this._webSockets.set(requestId, ws4); + } + onWebSocketRequest(requestId, requestData) { + const ws4 = this._webSockets.get(requestId); + if (!ws4) + return; + ws4.setWallTimeMs(requestData?.wallTimeMs); + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + if (requestData) + ws4.requestSent(requestData.headers); + } + onWebSocketResponse(requestId, responseData) { + const ws4 = this._webSockets.get(requestId); + if (!ws4) + return; + ws4.responseReceived(responseData.status, responseData.statusText, responseData.headers); + if (responseData.status >= 400) + ws4.error(`${responseData.statusText}: ${responseData.status}`); + } + onWebSocketFrameSent(requestId, opcode, data, wallTimeMs) { + const ws4 = this._webSockets.get(requestId); + if (ws4) + ws4.frameSent(opcode, data, wallTimeMs); + } + webSocketFrameReceived(requestId, opcode, data, wallTimeMs) { + const ws4 = this._webSockets.get(requestId); + if (ws4) + ws4.frameReceived(opcode, data, wallTimeMs); + } + webSocketClosed(requestId) { + const ws4 = this._webSockets.get(requestId); + if (ws4) { + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + ws4.closed(); + } + this._webSockets.delete(requestId); + } + webSocketError(requestId, errorMessage) { + const ws4 = this._webSockets.get(requestId); + if (ws4) { + if (ws4.markAsNotified()) { + this._page.emit(Page.Events.WebSocket, ws4); + this._page.browserContext.emit(BrowserContext.Events.WebSocket, ws4, this._page); + } + ws4.error(errorMessage); + } + } + _fireInternalFrameNavigation(frame, event) { + frame.emit(Frame.Events.InternalNavigation, event); + } + }; + FrameEvent = { + InternalNavigation: "internalnavigation", + AddLifecycle: "addlifecycle", + RemoveLifecycle: "removelifecycle" + }; + Frame = class _Frame extends SdkObject { + constructor(page, id, parentFrame) { + super(page, "frame"); + this._firedLifecycleEvents = /* @__PURE__ */ new Set(); + this._firedNetworkIdleSelf = false; + this._url = ""; + this._contextData = /* @__PURE__ */ new Map(); + this._childFrames = /* @__PURE__ */ new Set(); + this._name = ""; + this._inflightRequests = /* @__PURE__ */ new Set(); + this._detachedScope = new LongStandingScope(); + this._raceAgainstEvaluationStallingEventsPromises = /* @__PURE__ */ new Set(); + this._redirectedNavigations = /* @__PURE__ */ new Map(); + this.attribution.frame = this; + this.seq = page.frameManager._allocateFrameSeq(); + this._id = id; + this._page = page; + this._parentFrame = parentFrame; + this._currentDocument = { documentId: void 0, request: void 0 }; + this.selectors = new FrameSelectors(this); + this._contextData.set("main", { contextPromise: new ManualPromise(), context: null }); + this._contextData.set("utility", { contextPromise: new ManualPromise(), context: null }); + this._setContext("main", null); + this._setContext("utility", null); + if (this._parentFrame) + this._parentFrame._childFrames.add(this); + this._firedLifecycleEvents.add("commit"); + if (id !== kDummyFrameId) + this._startNetworkIdleTimer(); + } + static { + this.Events = FrameEvent; + } + _isDetached() { + return this._detachedScope.isClosed(); + } + onLifecycleEvent(event) { + if (this._firedLifecycleEvents.has(event)) + return; + this._firedLifecycleEvents.add(event); + this.emit(_Frame.Events.AddLifecycle, event); + if (this === this._page.mainFrame() && this._url !== "about:blank") + this.apiLog(` "${event}" event fired`); + this._page.mainFrame()._recalculateNetworkIdle(); + } + _onClearLifecycle() { + for (const event of this._firedLifecycleEvents) + this.emit(_Frame.Events.RemoveLifecycle, event); + this._firedLifecycleEvents.clear(); + this._inflightRequests = new Set(Array.from(this._inflightRequests).filter((request2) => request2 === this._currentDocument.request)); + this._stopNetworkIdleTimer(); + if (this._inflightRequests.size === 0) + this._startNetworkIdleTimer(); + this._page.mainFrame()._recalculateNetworkIdle(this); + this.onLifecycleEvent("commit"); + } + _setPendingDocument(documentInfo) { + this._pendingDocument = documentInfo; + if (documentInfo) + this.invalidateNonStallingEvaluations(new Error("Navigation interrupted the evaluation")); + } + pendingDocument() { + return this._pendingDocument; + } + invalidateNonStallingEvaluations(error) { + if (!this._raceAgainstEvaluationStallingEventsPromises.size) + return; + for (const promise of this._raceAgainstEvaluationStallingEventsPromises) + promise.reject(error); + } + async raceAgainstEvaluationStallingEvents(cb) { + if (this._pendingDocument) + throw new Error("Frame is currently attempting a navigation"); + if (this._page.browserContext.dialogManager.hasOpenDialogsForPage(this._page)) + throw new Error("Open JavaScript dialog prevents evaluation"); + const promise = new ManualPromise(); + this._raceAgainstEvaluationStallingEventsPromises.add(promise); + try { + return await Promise.race([ + cb(), + promise + ]); + } finally { + this._raceAgainstEvaluationStallingEventsPromises.delete(promise); + } + } + nonStallingRawEvaluateInExistingMainContext(expression2) { + return this.raceAgainstEvaluationStallingEvents(() => { + const context2 = this._existingMainContext(); + if (!context2) + throw new Error("Frame does not yet have a main execution context"); + return context2.rawEvaluateJSON(expression2); + }); + } + nonStallingEvaluateInExistingContext(expression2, world) { + return this.raceAgainstEvaluationStallingEvents(() => { + const context2 = this._contextData.get(world)?.context; + if (!context2) + throw new Error("Frame does not yet have the execution context"); + return context2.evaluateExpression(expression2, { isFunction: false }); + }); + } + _recalculateNetworkIdle(frameThatAllowsRemovingNetworkIdle) { + let isNetworkIdle = this._firedNetworkIdleSelf; + for (const child of this._childFrames) { + child._recalculateNetworkIdle(frameThatAllowsRemovingNetworkIdle); + if (!child._firedLifecycleEvents.has("networkidle")) + isNetworkIdle = false; + } + if (isNetworkIdle && !this._firedLifecycleEvents.has("networkidle")) { + this._firedLifecycleEvents.add("networkidle"); + this.emit(_Frame.Events.AddLifecycle, "networkidle"); + if (this === this._page.mainFrame() && this._url !== "about:blank") + this.apiLog(` "networkidle" event fired`); + } + if (frameThatAllowsRemovingNetworkIdle !== this && this._firedLifecycleEvents.has("networkidle") && !isNetworkIdle) { + this._firedLifecycleEvents.delete("networkidle"); + this.emit(_Frame.Events.RemoveLifecycle, "networkidle"); + } + } + async raceNavigationAction(progress2, action) { + progress2.setAllowConcurrentOrNestedRaces(true); + const result2 = await progress2.race(LongStandingScope.raceMultiple([ + this._detachedScope, + this._page.openScope + ], action().catch((e) => { + if (e instanceof NavigationAbortedError && e.documentId) { + const data = this._redirectedNavigations.get(e.documentId); + if (data) { + progress2.log(`waiting for redirected navigation to "${data.url}"`); + return progress2.race(data.gotoPromise); + } + } + throw e; + }))); + progress2.setAllowConcurrentOrNestedRaces(false); + return result2; + } + redirectNavigation(url3, documentId, referer) { + const controller = new ProgressController(); + const data = { + url: url3, + gotoPromise: controller.run((progress2) => this.gotoImpl(progress2, url3, { referer }), 0) + }; + this._redirectedNavigations.set(documentId, data); + data.gotoPromise.finally(() => this._redirectedNavigations.delete(documentId)); + } + async goto(progress2, url3, options = {}) { + const constructedNavigationURL = constructURLBasedOnBaseURL(this._page.browserContext._options.baseURL, url3); + return this.raceNavigationAction(progress2, async () => this.gotoImpl(progress2, constructedNavigationURL, options)); + } + async gotoImpl(progress2, url3, options) { + const waitUntil = verifyLifecycle("waitUntil", options.waitUntil === void 0 ? "load" : options.waitUntil); + progress2.log(`navigating to "${url3}", waiting until "${waitUntil}"`); + const headers = this._page.extraHTTPHeaders() || []; + const refererHeader = headers.find((h) => h.name.toLowerCase() === "referer"); + let referer = refererHeader ? refererHeader.value : void 0; + if (options.referer !== void 0) { + if (referer !== void 0 && referer !== options.referer) + throw new Error('"referer" is already specified as extra HTTP header'); + referer = options.referer; + } + url3 = helper.completeUserURL(url3); + const navigationEvents = []; + const collectNavigations = (arg) => navigationEvents.push(arg); + this.on(_Frame.Events.InternalNavigation, collectNavigations); + let navigateResult; + try { + navigateResult = await progress2.race(this._page.delegate.navigateFrame(this, url3, referer)); + } finally { + this.off(_Frame.Events.InternalNavigation, collectNavigations); + } + let event; + if (navigateResult.newDocumentId) { + const predicate = (event2) => { + return event2.newDocument && (event2.newDocument.documentId === navigateResult.newDocumentId || !event2.error); + }; + const events = navigationEvents.filter(predicate); + if (events.length) + event = events[0]; + else + event = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, predicate).promise; + if (event.newDocument.documentId !== navigateResult.newDocumentId) { + throw new NavigationAbortedError(navigateResult.newDocumentId, `Navigation to "${url3}" is interrupted by another navigation to "${event.url}"`); + } + if (event.error) + throw event.error; + } else { + const predicate = (e) => !e.newDocument; + const events = navigationEvents.filter(predicate); + if (events.length) + event = events[0]; + else + event = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, predicate).promise; + } + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + const request2 = event.newDocument ? event.newDocument.request : void 0; + const response2 = request2 ? await request2._finalRequest().response(progress2) : null; + return response2; + } + async waitForNavigation(progress2, requiresNewDocument, options) { + const waitUntil = verifyLifecycle("waitUntil", options.waitUntil === void 0 ? "load" : options.waitUntil); + progress2.log(`waiting for navigation until "${waitUntil}"`); + const navigationEvent = await helper.waitForEvent(progress2, this, _Frame.Events.InternalNavigation, (event) => { + if (event.error) + return true; + if (requiresNewDocument && !event.newDocument) + return false; + progress2.log(` navigated to "${this._url}"`); + return true; + }).promise; + if (navigationEvent.error) + throw navigationEvent.error; + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + const request2 = navigationEvent.newDocument ? navigationEvent.newDocument.request : void 0; + return request2 ? request2._finalRequest().response(progress2) : null; + } + async waitForLoadState(progress2, state) { + const waitUntil = verifyLifecycle("state", state); + if (!this._firedLifecycleEvents.has(waitUntil)) + await helper.waitForEvent(progress2, this, _Frame.Events.AddLifecycle, (e) => e === waitUntil).promise; + } + async frameElement(progress2) { + return await progress2.race(this._page.delegate.getFrameElement(this)); + } + context(world) { + if (this._page.delegate.noUtilityWorld?.()) + world = "main"; + return this._contextData.get(world).contextPromise.then((contextOrDestroyedReason) => { + if (contextOrDestroyedReason instanceof ExecutionContext) + return contextOrDestroyedReason; + throw new Error(contextOrDestroyedReason.destroyedReason); + }); + } + mainContext() { + return this.context("main"); + } + _existingMainContext() { + return this._contextData.get("main")?.context || null; + } + utilityContext() { + return this.context("utility"); + } + async evaluateExpression(progress2, expression2, options = {}, arg) { + return await progress2.race(this._evaluateExpression(expression2, options, arg)); + } + async _evaluateExpression(expression2, options = {}, arg) { + const context2 = await this.context(options.world ?? "main"); + const value2 = await context2.evaluateExpression(expression2, options, arg); + return value2; + } + async evaluateExpressionHandle(progress2, expression2, options = {}, arg) { + return await progress2.race(this._evaluateExpressionHandle(expression2, options, arg)); + } + async _evaluateExpressionHandle(expression2, options = {}, arg) { + const context2 = await this.context(options.world ?? "main"); + const value2 = await context2.evaluateExpressionHandle(expression2, options, arg); + return value2; + } + async querySelector(progress2, selector, options) { + this.apiLog(` finding element using the selector "${selector}"`); + return progress2.race(this.selectors.query(selector, options)); + } + async waitForSelector(progress2, selector, performActionPreChecksAndLog, options, scope) { + if (options.visibility) + throw new Error("options.visibility is not supported, did you mean options.state?"); + if (options.waitFor && options.waitFor !== "visible") + throw new Error("options.waitFor is not supported, did you mean options.state?"); + const { state = "visible" } = options; + if (!["attached", "detached", "visible", "hidden"].includes(state)) + throw new Error(`state: expected one of (attached|detached|visible|hidden)`); + if (performActionPreChecksAndLog) + progress2.log(`waiting for ${this._asLocator(selector)}${state === "attached" ? "" : " to be " + state}`); + const promise = this.retryWithProgressAndBackoff(progress2, async (progress3, continuePolling) => { + if (performActionPreChecksAndLog) + await this._page.performActionPreChecks(progress3); + if (scope && await progress3.race(scope.evaluateInUtility(([injected, node]) => node.isConnected, {})) !== true) + throw new NonRecoverableDOMError("Element is not attached to the DOM"); + const resolved = await progress3.race(this.selectors.callOnSelectorHandle(selector, { ...options, scope }, ({ injected, elements }) => { + const element4 = elements[0]; + const visible2 = element4 ? injected.utils.isElementVisible(element4) : false; + let log3 = ""; + if (elements.length > 1) + log3 = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`; + else if (element4) + log3 = ` locator resolved to ${visible2 ? "visible" : "hidden"} ${injected.previewNode(element4)}`; + return { log: log3, element: element4, visible: visible2, attached: !!element4 }; + }, {})); + if (!resolved) { + if (state === "hidden" || state === "detached") + return null; + return continuePolling; + } + const result2 = resolved.result; + const { log: log2, visible, attached } = await progress3.race(result2.evaluate((r) => ({ log: r.log, visible: r.visible, attached: r.attached }))); + if (log2) + progress3.log(log2); + const success = { attached, detached: !attached, visible, hidden: !visible }[state]; + if (!success) { + result2.dispose(); + return continuePolling; + } + if (options.omitReturnValue) { + result2.dispose(); + return null; + } + const element3 = state === "attached" || state === "visible" ? await progress3.race(result2.evaluateHandle((r) => r.element)) : null; + result2.dispose(); + if (!element3) + return null; + if (options.__testHookBeforeAdoptNode) + await progress3.race(options.__testHookBeforeAdoptNode()); + try { + const mainContext = await progress3.race(element3._frame.mainContext()); + return await progress3.race(element3._adoptTo(mainContext)); + } catch (e) { + return continuePolling; + } + }); + return scope ? scope._context.raceAgainstContextDestroyed(promise) : promise; + } + async dispatchEvent(progress2, selector, type3, eventInit = {}, options, scope) { + await this._waitForFunctionOnSelector(progress2, selector, (injectedScript, element3, data) => { + injectedScript.dispatchEvent(element3, data.type, data.eventInit); + return { result: void 0 }; + }, { type: type3, eventInit }, { mainWorld: true, ...options }, scope); + } + async evalOnSelector(progress2, selector, strict, expression2, isFunction2, arg, scope) { + return progress2.race(this._evalOnSelector(selector, strict, expression2, isFunction2, arg, scope)); + } + async _evalOnSelector(selector, strict, expression2, isFunction2, arg, scope) { + const handle = await this.selectors.query(selector, { strict }, scope); + if (!handle) + throw new Error(`Failed to find element matching selector "${selector}"`); + const result2 = await handle.internalEvaluateExpression(expression2, { isFunction: isFunction2 }, arg); + handle.dispose(); + return result2; + } + async evalOnSelectorAll(progress2, selector, expression2, isFunction2, arg, scope) { + return progress2.race(this._evalOnSelectorAll(selector, expression2, isFunction2, arg, scope)); + } + async _evalOnSelectorAll(selector, expression2, isFunction2, arg, scope) { + const arrayHandle = await this.selectors.queryArrayInMainWorld(selector, scope); + const result2 = await arrayHandle.internalEvaluateExpression(expression2, { isFunction: isFunction2 }, arg); + arrayHandle.dispose(); + return result2; + } + async querySelectorAll(progress2, selector) { + return progress2.race(this.selectors.queryAll(selector)); + } + async queryCount(progress2, selector) { + try { + return await progress2.race(this.selectors.queryCount(selector)); + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + return 0; + } + } + async content(progress2) { + return progress2.race(this._content()); + } + async _content() { + try { + const context2 = await this.utilityContext(); + return await context2.evaluate(() => { + let retVal = ""; + if (document.doctype) + retVal = new XMLSerializer().serializeToString(document.doctype); + if (document.documentElement) + retVal += document.documentElement.outerHTML; + return retVal; + }); + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + throw new Error(`Unable to retrieve content because the page is navigating and changing the content.`); + } + } + async setContent(progress2, html, options) { + const tag = `--playwright--set--content--${createGuid()}--`; + await this.raceNavigationAction(progress2, async () => { + const waitUntil = options.waitUntil === void 0 ? "load" : options.waitUntil; + progress2.log(`setting frame content, waiting until "${waitUntil}"`); + const context2 = await progress2.race(this.utilityContext()); + const tagPromise = new ManualPromise(); + this._page.frameManager._consoleMessageTags.set(tag, () => { + this._onClearLifecycle(); + tagPromise.resolve(); + }); + progress2.setAllowConcurrentOrNestedRaces(true); + const lifecyclePromise = progress2.race(tagPromise).then(() => this.waitForLoadState(progress2, waitUntil)); + const contentPromise = progress2.race(context2.evaluate(({ html: html2, tag: tag2 }) => { + document.open(); + console.debug(tag2); + document.write(html2); + document.close(); + }, { html, tag })); + await Promise.all([contentPromise, lifecyclePromise]); + progress2.setAllowConcurrentOrNestedRaces(false); + return null; + }).finally(() => { + this._page.frameManager._consoleMessageTags.delete(tag); + }); + } + name() { + return this._name || ""; + } + url() { + return this._url; + } + origin() { + if (!this._url.startsWith("http")) + return; + return parseURL2(this._url)?.origin; + } + parentFrame() { + return this._parentFrame; + } + _getChildFrames() { + return Array.from(this._childFrames); + } + async addScriptTag(progress2, params2) { + return await progress2.race(this._addScriptTag(params2)); + } + async _addScriptTag(params2) { + const { + url: url3 = null, + content = null, + type: type3 = "" + } = params2; + if (!url3 && !content) + throw new Error("Provide an object with a `url`, `path` or `content` property"); + const context2 = await this.mainContext(); + return this._raceWithCSPError(async () => { + if (url3 !== null) + return (await context2.evaluateHandle(addScriptUrl, { url: url3, type: type3 })).asElement(); + const result2 = (await context2.evaluateHandle(addScriptContent, { content, type: type3 })).asElement(); + if (this._page.delegate.cspErrorsAsynchronousForInlineScripts) + await context2.evaluate(() => true); + return result2; + }); + async function addScriptUrl(params3) { + const script = document.createElement("script"); + script.src = params3.url; + if (params3.type) + script.type = params3.type; + const promise = new Promise((res, rej) => { + script.onload = res; + script.onerror = (e) => rej(typeof e === "string" ? new Error(e) : new Error(`Failed to load script at ${script.src}`)); + }); + document.head.appendChild(script); + await promise; + return script; + } + function addScriptContent(params3) { + const script = document.createElement("script"); + script.type = params3.type || "text/javascript"; + script.text = params3.content; + let error = null; + script.onerror = (e) => error = e; + document.head.appendChild(script); + if (error) + throw error; + return script; + } + } + async addStyleTag(progress2, params2) { + return await progress2.race(this._addStyleTag(params2)); + } + async _addStyleTag(params2) { + const { + url: url3 = null, + content = null + } = params2; + if (!url3 && !content) + throw new Error("Provide an object with a `url`, `path` or `content` property"); + const context2 = await this.mainContext(); + return this._raceWithCSPError(async () => { + if (url3 !== null) + return (await context2.evaluateHandle(addStyleUrl, url3)).asElement(); + return (await context2.evaluateHandle(addStyleContent, content)).asElement(); + }); + async function addStyleUrl(url4) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = url4; + const promise = new Promise((res, rej) => { + link.onload = res; + link.onerror = rej; + }); + document.head.appendChild(link); + await promise; + return link; + } + async function addStyleContent(content2) { + const style = document.createElement("style"); + style.type = "text/css"; + style.appendChild(document.createTextNode(content2)); + const promise = new Promise((res, rej) => { + style.onload = res; + style.onerror = rej; + }); + document.head.appendChild(style); + await promise; + return style; + } + } + async _raceWithCSPError(func) { + const listeners = []; + let result2; + let error; + let cspMessage; + const actionPromise = func().then((r) => result2 = r).catch((e) => error = e); + const errorPromise = new Promise((resolve) => { + listeners.push(eventsHelper.addEventListener(this._page.browserContext, BrowserContext.Events.Console, (message) => { + if (message.page() !== this._page || message.type() !== "error") + return; + if (message.text().includes("Content-Security-Policy") || message.text().includes("Content Security Policy")) { + cspMessage = message; + resolve(); + } + })); + }); + await Promise.race([actionPromise, errorPromise]); + eventsHelper.removeEventListeners(listeners); + if (cspMessage) + throw new Error(cspMessage.text()); + if (error) + throw error; + return result2; + } + async retryWithProgressAndBackoff(progress2, action) { + const backoffScale = [20, 50, 100, 100, 500]; + if (progress2.timeout) { + while (backoffScale.length && backoffScale[backoffScale.length - 1] > progress2.timeout / 5) + backoffScale.pop(); + } + return await this.retryWithProgressAndTimeouts(progress2, backoffScale, action); + } + async retryWithProgressAndTimeouts(progress2, timeouts, action) { + const continuePolling = /* @__PURE__ */ Symbol("continuePolling"); + timeouts = [0, ...timeouts]; + let timeoutIndex = 0; + while (true) { + const timeout = timeouts[Math.min(timeoutIndex++, timeouts.length - 1)]; + if (timeout) { + const actionPromise = new Promise((f) => setTimeout(f, timeout)); + await progress2.race(LongStandingScope.raceMultiple([ + this._page.openScope, + this._detachedScope + ], actionPromise)); + } + try { + const result2 = await action(progress2, continuePolling); + if (result2 === continuePolling) + continue; + return result2; + } catch (e) { + if (this.isNonRetriableError(e)) + throw e; + continue; + } + } + } + isNonRetriableError(e) { + if (isAbortError(e)) + return true; + if (isJavaScriptErrorInEvaluate(e) || isSessionClosedError(e)) + return true; + if (isNonRecoverableDOMError(e) || isInvalidSelectorError(e)) + return true; + if (this._isDetached()) + return true; + return false; + } + async _retryWithProgressIfNotConnected(progress2, selector, options, action) { + progress2.log(`waiting for ${this._asLocator(selector)}`); + const noAutoWaiting = options.__testHookNoAutoWaiting ?? options.noAutoWaiting; + const performActionPreChecks = (options.performActionPreChecks ?? !options.force) && !noAutoWaiting; + return this.retryWithProgressAndBackoff(progress2, async (progress3, continuePolling) => { + if (performActionPreChecks) + await this._page.performActionPreChecks(progress3); + const resolved = await progress3.race(this.selectors.callOnSelectorHandle(selector, { strict: options.strict, markTargets: "all" }, ({ injected, elements }) => { + const element4 = elements[0]; + let log3 = ""; + if (elements.length > 1) + log3 = ` locator resolved to ${elements.length} elements. Proceeding with the first one: ${injected.previewNode(elements[0])}`; + else if (element4) + log3 = ` locator resolved to ${injected.previewNode(element4)}`; + return { log: log3, success: !!element4, element: element4 }; + }, {})); + if (!resolved) { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element(s) not found"); + return continuePolling; + } + const result2 = resolved.result; + const { log: log2, success } = await progress3.race(result2.evaluate((r) => ({ log: r.log, success: r.success }))); + if (log2) + progress3.log(log2); + if (!success) { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element(s) not found"); + result2.dispose(); + return continuePolling; + } + const element3 = await progress3.race(result2.evaluateHandle((r) => r.element)); + result2.dispose(); + try { + const result3 = await action(progress3, element3); + if (result3 === "error:notconnected") { + if (noAutoWaiting) + throw new NonRecoverableDOMError("Element is not attached to the DOM"); + progress3.log("element was detached from the DOM, retrying"); + return continuePolling; + } + return result3; + } finally { + element3?.dispose(); + } + }); + } + async rafrafTimeoutScreenshotElementWithProgress(progress2, selector, timeout, options) { + return await this._retryWithProgressIfNotConnected(progress2, selector, { strict: true, performActionPreChecks: true }, async (progress3, handle) => { + await handle._frame.rafrafTimeout(progress3, timeout); + return await this._page.screenshotter.screenshotElement(progress3, handle, options); + }); + } + async click(progress2, selector, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._click(progress3, { ...options, waitAfter: !options.noWaitAfter }))); + } + async dblclick(progress2, selector, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._dblclick(progress3, options))); + } + async dragAndDrop(progress2, source12, target, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, source12, options, async (progress3, handle) => { + return handle._retryPointerAction(progress3, "move and down", false, async (progress4, point) => { + await this._page.mouse.move(progress4, point.x, point.y); + await this._page.mouse.down(progress4); + }, { + ...options, + waitAfter: "disabled", + position: options.sourcePosition + }); + })); + assertDone(await this._retryWithProgressIfNotConnected(progress2, target, { ...options, performActionPreChecks: false }, async (progress3, handle) => { + return handle._retryPointerAction(progress3, "move and up", false, async (progress4, point) => { + await this._page.mouse.move(progress4, point.x, point.y, { steps: options.steps }); + await this._page.mouse.up(progress4); + }, { + ...options, + waitAfter: "disabled", + position: options.targetPosition + }); + })); + } + async tap(progress2, selector, options) { + if (!this._page.browserContext._options.hasTouch) + throw new Error("The page does not support tap. Use hasTouch context option to enable touch support."); + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._tap(progress3, options))); + } + async fill(progress2, selector, value2, options) { + return assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._fill(progress3, value2, options))); + } + async focus(progress2, selector, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._focus(progress3))); + } + async blur(progress2, selector, options) { + assertDone(await this._retryWithProgressIfNotConnected(progress2, selector, options, (progress3, handle) => handle._blur(progress3))); + } + async resolveSelector(progress2, selector, options = {}) { + const element3 = await progress2.race(this.selectors.query(selector, options)); + if (!element3) + throw new Error(`No element matching ${selector}`); + const generated = await progress2.race(element3.evaluateInUtility(async ([injected, node]) => { + return injected.generateSelectorSimple(node); + }, {})); + if (!generated) + throw new Error(`Unable to generate locator for ${selector}`); + let frame = element3._frame; + const result2 = [generated]; + while (frame?.parentFrame()) { + const frameElement = await frame.frameElement(progress2); + if (frameElement) { + const generated2 = await progress2.race(frameElement.evaluateInUtility(async ([injected, node]) => { + return injected.generateSelectorSimple(node); + }, {})); + frameElement.dispose(); + if (generated2 === "error:notconnected" || !generated2) + throw new Error(`Unable to generate locator for ${selector}`); + result2.push(generated2); + } + frame = frame.parentFrame(); + } + const resolvedSelector = result2.reverse().join(" >> internal:control=enter-frame >> "); + return { resolvedSelector }; + } + async textContent(progress2, selector, options, scope) { + const { result: result2 } = await this._waitForFunctionOnSelector(progress2, selector, (injected, element3) => ({ result: element3.textContent }), void 0, options, scope); + return result2; + } + async innerText(progress2, selector, options, scope) { + const { result: result2 } = await this._waitForFunctionOnSelector(progress2, selector, (injectedScript, element3) => { + if (element3.namespaceURI !== "http://www.w3.org/1999/xhtml") + throw injectedScript.createStacklessError("Node is not an HTMLElement"); + return { result: element3.innerText }; + }, void 0, options, scope); + return result2; + } + async innerHTML(progress2, selector, options, scope) { + const { result: result2 } = await this._waitForFunctionOnSelector(progress2, selector, (injected, element3) => ({ result: element3.innerHTML }), void 0, options, scope); + return result2; + } + async getAttribute(progress2, selector, name, options, scope) { + const { result: result2 } = await this._waitForFunctionOnSelector(progress2, selector, (injected, element3, data) => ({ result: element3.getAttribute(data.name) }), { name }, options, scope); + return result2; + } + async inputValue(progress2, selector, options, scope) { + const { result: result2 } = await this._waitForFunctionOnSelector(progress2, selector, (injectedScript, node) => { + const element3 = injectedScript.retarget(node, "follow-label"); + if (!element3 || element3.nodeName !== "INPUT" && element3.nodeName !== "TEXTAREA" && element3.nodeName !== "SELECT") + throw injectedScript.createStacklessError("Node is not an ,

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" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + } + } +} diff --git a/tools/e2e/node_modules/playwright-core/LICENSE b/tools/e2e/node_modules/playwright-core/LICENSE new file mode 100644 index 0000000..4ace03d --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Portions Copyright (c) Microsoft Corporation. + Portions Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tools/e2e/node_modules/playwright-core/NOTICE b/tools/e2e/node_modules/playwright-core/NOTICE new file mode 100644 index 0000000..814ec16 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/NOTICE @@ -0,0 +1,5 @@ +Playwright +Copyright (c) Microsoft Corporation + +This software contains code derived from the Puppeteer project (https://github.com/puppeteer/puppeteer), +available under the Apache 2.0 license (https://github.com/puppeteer/puppeteer/blob/master/LICENSE). diff --git a/tools/e2e/node_modules/playwright-core/README.md b/tools/e2e/node_modules/playwright-core/README.md new file mode 100644 index 0000000..422b373 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/README.md @@ -0,0 +1,3 @@ +# playwright-core + +This package contains the no-browser flavor of [Playwright](http://github.com/microsoft/playwright). diff --git a/tools/e2e/node_modules/playwright-core/ThirdPartyNotices.txt b/tools/e2e/node_modules/playwright-core/ThirdPartyNotices.txt new file mode 100644 index 0000000..369e202 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/ThirdPartyNotices.txt @@ -0,0 +1,13 @@ +microsoft/playwright-core + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This package bundles third-party software inside individual files under +`lib/`. Each bundled output has a sidecar `.js.LICENSE` file next +to it listing every npm package whose source was inlined into that +bundle, together with the full license text for each. + +For example: +- lib/utilsBundle.js.LICENSE + +This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. diff --git a/tools/e2e/node_modules/playwright-core/bin/install_media_pack.ps1 b/tools/e2e/node_modules/playwright-core/bin/install_media_pack.ps1 new file mode 100644 index 0000000..6170754 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/install_media_pack.ps1 @@ -0,0 +1,5 @@ +$osInfo = Get-WmiObject -Class Win32_OperatingSystem +# check if running on Windows Server +if ($osInfo.ProductType -eq 3) { + Install-WindowsFeature Server-Media-Foundation +} diff --git a/tools/e2e/node_modules/playwright-core/bin/install_webkit_wsl.ps1 b/tools/e2e/node_modules/playwright-core/bin/install_webkit_wsl.ps1 new file mode 100644 index 0000000..ccaaf15 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/install_webkit_wsl.ps1 @@ -0,0 +1,33 @@ +$ErrorActionPreference = 'Stop' + +# This script sets up a WSL distribution that will be used to run WebKit. + +$Distribution = "playwright" +$Username = "pwuser" + +$distributions = (wsl --list --quiet) -split "\r?\n" +if ($distributions -contains $Distribution) { + Write-Host "WSL distribution '$Distribution' already exists. Skipping installation." +} else { + Write-Host "Installing new WSL distribution '$Distribution'..." + $VhdSize = "10GB" + wsl --install -d Ubuntu-24.04 --name $Distribution --no-launch --vhd-size $VhdSize + wsl -d $Distribution -u root adduser --gecos GECOS --disabled-password $Username +} + +$pwshDirname = (Resolve-Path -Path $PSScriptRoot).Path; +$playwrightCoreRoot = Resolve-Path (Join-Path $pwshDirname "..") + +$initScript = @" +if [ ! -f "/home/$Username/node/bin/node" ]; then + mkdir -p /home/$Username/node + curl -fsSL https://nodejs.org/dist/v22.17.0/node-v22.17.0-linux-x64.tar.xz -o /home/$Username/node/node-v22.17.0-linux-x64.tar.xz + tar -xJf /home/$Username/node/node-v22.17.0-linux-x64.tar.xz -C /home/$Username/node --strip-components=1 + sudo -u $Username echo 'export PATH=/home/$Username/node/bin:\`$PATH' >> /home/$Username/.profile +fi +/home/$Username/node/bin/node cli.js install-deps webkit +sudo -u $Username PLAYWRIGHT_SKIP_BROWSER_GC=1 /home/$Username/node/bin/node cli.js install webkit +"@ -replace "\r\n", "`n" + +wsl -d $Distribution --cd $playwrightCoreRoot -u root -- bash -c "$initScript" +Write-Host "Done!" \ No newline at end of file diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh new file mode 100755 index 0000000..13d55df --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -e +set -x + +if [[ $(arch) == "aarch64" ]]; then + echo "ERROR: not supported on Linux Arm64" + exit 1 +fi + +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then + if [[ ! -f "/etc/os-release" ]]; then + echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)" + exit 1 + fi + + ID=$(bash -c 'source /etc/os-release && echo $ID') + if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then + echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported" + exit 1 + fi +fi + +# 1. make sure to remove old beta if any. +if dpkg --get-selections | grep -q "^google-chrome-beta[[:space:]]*install$" >/dev/null; then + apt-get remove -y google-chrome-beta +fi + +# 2. Update apt lists (needed to install curl and chrome dependencies) +apt-get update + +# 3. Install curl to download chrome +if ! command -v curl >/dev/null; then + apt-get install -y curl +fi + +# 4. download chrome beta from dl.google.com and install it. +cd /tmp +curl -L -O https://dl.google.com/linux/direct/google-chrome-beta_current_amd64.deb +apt-get install -y ./google-chrome-beta_current_amd64.deb +rm -rf ./google-chrome-beta_current_amd64.deb +cd - +google-chrome-beta --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh new file mode 100755 index 0000000..60b4b7f --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e +set -x + +rm -rf "/Applications/Google Chrome Beta.app" +cd /tmp +curl -L --retry 3 -o ./googlechromebeta.dmg https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg +hdiutil attach -nobrowse -quiet -noautofsck -noautoopen -mountpoint /Volumes/googlechromebeta.dmg ./googlechromebeta.dmg +cp -pR "/Volumes/googlechromebeta.dmg/Google Chrome Beta.app" /Applications +hdiutil detach /Volumes/googlechromebeta.dmg +rm -rf /tmp/googlechromebeta.dmg + +/Applications/Google\ Chrome\ Beta.app/Contents/MacOS/Google\ Chrome\ Beta --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 new file mode 100644 index 0000000..3fbe551 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 @@ -0,0 +1,24 @@ +$ErrorActionPreference = 'Stop' + +$url = 'https://dl.google.com/tag/s/dl/chrome/install/beta/googlechromebetastandaloneenterprise64.msi' + +Write-Host "Downloading Google Chrome Beta" +$wc = New-Object net.webclient +$msiInstaller = "$env:temp\google-chrome-beta.msi" +$wc.Downloadfile($url, $msiInstaller) + +Write-Host "Installing Google Chrome Beta" +$arguments = "/i `"$msiInstaller`" /quiet" +Start-Process msiexec.exe -ArgumentList $arguments -Wait +Remove-Item $msiInstaller + +$suffix = "\\Google\\Chrome Beta\\Application\\chrome.exe" +if (Test-Path "${env:ProgramFiles(x86)}$suffix") { + (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo +} elseif (Test-Path "${env:ProgramFiles}$suffix") { + (Get-Item "${env:ProgramFiles}$suffix").VersionInfo +} else { + Write-Host "ERROR: Failed to install Google Chrome Beta." + Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help." + exit 1 +} diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh new file mode 100755 index 0000000..64bc139 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +set -e +set -x + +if [[ $(arch) == "aarch64" ]]; then + echo "ERROR: not supported on Linux Arm64" + exit 1 +fi + +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then + if [[ ! -f "/etc/os-release" ]]; then + echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)" + exit 1 + fi + + ID=$(bash -c 'source /etc/os-release && echo $ID') + if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then + echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported" + exit 1 + fi +fi + +# 1. make sure to remove old stable if any. +if dpkg --get-selections | grep -q "^google-chrome[[:space:]]*install$" >/dev/null; then + apt-get remove -y google-chrome +fi + +# 2. Update apt lists (needed to install curl and chrome dependencies) +apt-get update + +# 3. Install curl to download chrome +if ! command -v curl >/dev/null; then + apt-get install -y curl +fi + +# 4. download chrome stable from dl.google.com and install it. +cd /tmp +curl -L -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +apt-get install -y ./google-chrome-stable_current_amd64.deb +rm -rf ./google-chrome-stable_current_amd64.deb +cd - +google-chrome --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh new file mode 100755 index 0000000..7db7a0f --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -e +set -x + +rm -rf "/Applications/Google Chrome.app" +cd /tmp +curl -L --retry 3 -o ./googlechrome.dmg https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg +hdiutil attach -nobrowse -quiet -noautofsck -noautoopen -mountpoint /Volumes/googlechrome.dmg ./googlechrome.dmg +cp -pR "/Volumes/googlechrome.dmg/Google Chrome.app" /Applications +hdiutil detach /Volumes/googlechrome.dmg +rm -rf /tmp/googlechrome.dmg +/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 new file mode 100644 index 0000000..7ca2dba --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 @@ -0,0 +1,24 @@ +$ErrorActionPreference = 'Stop' +$url = 'https://dl.google.com/tag/s/dl/chrome/install/googlechromestandaloneenterprise64.msi' + +$wc = New-Object net.webclient +$msiInstaller = "$env:temp\google-chrome.msi" +Write-Host "Downloading Google Chrome" +$wc.Downloadfile($url, $msiInstaller) + +Write-Host "Installing Google Chrome" +$arguments = "/i `"$msiInstaller`" /quiet" +Start-Process msiexec.exe -ArgumentList $arguments -Wait +Remove-Item $msiInstaller + + +$suffix = "\\Google\\Chrome\\Application\\chrome.exe" +if (Test-Path "${env:ProgramFiles(x86)}$suffix") { + (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo +} elseif (Test-Path "${env:ProgramFiles}$suffix") { + (Get-Item "${env:ProgramFiles}$suffix").VersionInfo +} else { + Write-Host "ERROR: Failed to install Google Chrome." + Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help." + exit 1 +} diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh new file mode 100755 index 0000000..e1f156a --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -e +set -x + +if [[ $(arch) == "aarch64" ]]; then + echo "ERROR: not supported on Linux Arm64" + exit 1 +fi + +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then + if [[ ! -f "/etc/os-release" ]]; then + echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)" + exit 1 + fi + + ID=$(bash -c 'source /etc/os-release && echo $ID') + if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then + echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported" + exit 1 + fi +fi + +# 1. make sure to remove old beta if any. +if dpkg --get-selections | grep -q "^microsoft-edge-beta[[:space:]]*install$" >/dev/null; then + apt-get remove -y microsoft-edge-beta +fi + +# 2. Install curl to download Microsoft gpg key +if ! command -v curl >/dev/null; then + apt-get update + apt-get install -y curl +fi + +# GnuPG is not preinstalled in slim images +if ! command -v gpg >/dev/null; then + apt-get update + apt-get install -y gpg +fi + +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/ +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list' +rm /tmp/microsoft.gpg +apt-get update && apt-get install -y microsoft-edge-beta + +microsoft-edge-beta --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh new file mode 100755 index 0000000..528a0e7 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e +set -x + +cd /tmp +curl -L --retry 3 -o ./msedge_beta.pkg "$1" +# Note: there's no way to uninstall previously installed MSEdge. +# However, running PKG again seems to update installation. +sudo installer -pkg /tmp/msedge_beta.pkg -target / +rm -rf /tmp/msedge_beta.pkg +/Applications/Microsoft\ Edge\ Beta.app/Contents/MacOS/Microsoft\ Edge\ Beta --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 new file mode 100644 index 0000000..cce0d0b --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 @@ -0,0 +1,23 @@ +$ErrorActionPreference = 'Stop' +$url = $args[0] + +Write-Host "Downloading Microsoft Edge Beta" +$wc = New-Object net.webclient +$msiInstaller = "$env:temp\microsoft-edge-beta.msi" +$wc.Downloadfile($url, $msiInstaller) + +Write-Host "Installing Microsoft Edge Beta" +$arguments = "/i `"$msiInstaller`" /quiet" +Start-Process msiexec.exe -ArgumentList $arguments -Wait +Remove-Item $msiInstaller + +$suffix = "\\Microsoft\\Edge Beta\\Application\\msedge.exe" +if (Test-Path "${env:ProgramFiles(x86)}$suffix") { + (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo +} elseif (Test-Path "${env:ProgramFiles}$suffix") { + (Get-Item "${env:ProgramFiles}$suffix").VersionInfo +} else { + Write-Host "ERROR: Failed to install Microsoft Edge Beta." + Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help." + exit 1 +} diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh new file mode 100755 index 0000000..6c1a151 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -e +set -x + +if [[ $(arch) == "aarch64" ]]; then + echo "ERROR: not supported on Linux Arm64" + exit 1 +fi + +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then + if [[ ! -f "/etc/os-release" ]]; then + echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)" + exit 1 + fi + + ID=$(bash -c 'source /etc/os-release && echo $ID') + if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then + echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported" + exit 1 + fi +fi + +# 1. make sure to remove old dev if any. +if dpkg --get-selections | grep -q "^microsoft-edge-dev[[:space:]]*install$" >/dev/null; then + apt-get remove -y microsoft-edge-dev +fi + +# 2. Install curl to download Microsoft gpg key +if ! command -v curl >/dev/null; then + apt-get update + apt-get install -y curl +fi + +# GnuPG is not preinstalled in slim images +if ! command -v gpg >/dev/null; then + apt-get update + apt-get install -y gpg +fi + +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/ +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-dev.list' +rm /tmp/microsoft.gpg +apt-get update && apt-get install -y microsoft-edge-dev + +microsoft-edge-dev --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh new file mode 100755 index 0000000..e35ea4e --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e +set -x + +cd /tmp +curl -L --retry 3 -o ./msedge_dev.pkg "$1" +# Note: there's no way to uninstall previously installed MSEdge. +# However, running PKG again seems to update installation. +sudo installer -pkg /tmp/msedge_dev.pkg -target / +rm -rf /tmp/msedge_dev.pkg +/Applications/Microsoft\ Edge\ Dev.app/Contents/MacOS/Microsoft\ Edge\ Dev --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 new file mode 100644 index 0000000..22e6db8 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 @@ -0,0 +1,23 @@ +$ErrorActionPreference = 'Stop' +$url = $args[0] + +Write-Host "Downloading Microsoft Edge Dev" +$wc = New-Object net.webclient +$msiInstaller = "$env:temp\microsoft-edge-dev.msi" +$wc.Downloadfile($url, $msiInstaller) + +Write-Host "Installing Microsoft Edge Dev" +$arguments = "/i `"$msiInstaller`" /quiet" +Start-Process msiexec.exe -ArgumentList $arguments -Wait +Remove-Item $msiInstaller + +$suffix = "\\Microsoft\\Edge Dev\\Application\\msedge.exe" +if (Test-Path "${env:ProgramFiles(x86)}$suffix") { + (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo +} elseif (Test-Path "${env:ProgramFiles}$suffix") { + (Get-Item "${env:ProgramFiles}$suffix").VersionInfo +} else { + Write-Host "ERROR: Failed to install Microsoft Edge Dev." + Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help." + exit 1 +} diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh new file mode 100755 index 0000000..93bd766 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +set -e +set -x + +if [[ $(arch) == "aarch64" ]]; then + echo "ERROR: not supported on Linux Arm64" + exit 1 +fi + +if [ -z "$PLAYWRIGHT_HOST_PLATFORM_OVERRIDE" ]; then + if [[ ! -f "/etc/os-release" ]]; then + echo "ERROR: cannot install on unknown linux distribution (/etc/os-release is missing)" + exit 1 + fi + + ID=$(bash -c 'source /etc/os-release && echo $ID') + if [[ "${ID}" != "ubuntu" && "${ID}" != "debian" ]]; then + echo "ERROR: cannot install on $ID distribution - only Ubuntu and Debian are supported" + exit 1 + fi +fi + +# 1. make sure to remove old stable if any. +if dpkg --get-selections | grep -q "^microsoft-edge-stable[[:space:]]*install$" >/dev/null; then + apt-get remove -y microsoft-edge-stable +fi + +# 2. Install curl to download Microsoft gpg key +if ! command -v curl >/dev/null; then + apt-get update + apt-get install -y curl +fi + +# GnuPG is not preinstalled in slim images +if ! command -v gpg >/dev/null; then + apt-get update + apt-get install -y gpg +fi + +# 3. Add the GPG key, the apt repo, update the apt cache, and install the package +curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /tmp/microsoft.gpg +install -o root -g root -m 644 /tmp/microsoft.gpg /etc/apt/trusted.gpg.d/ +sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/edge stable main" > /etc/apt/sources.list.d/microsoft-edge-stable.list' +rm /tmp/microsoft.gpg +apt-get update && apt-get install -y microsoft-edge-stable + +microsoft-edge-stable --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh new file mode 100755 index 0000000..44e5a56 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e +set -x + +cd /tmp +curl -L --retry 3 -o ./msedge_stable.pkg "$1" +# Note: there's no way to uninstall previously installed MSEdge. +# However, running PKG again seems to update installation. +sudo installer -pkg /tmp/msedge_stable.pkg -target / +rm -rf /tmp/msedge_stable.pkg +/Applications/Microsoft\ Edge.app/Contents/MacOS/Microsoft\ Edge --version diff --git a/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 new file mode 100644 index 0000000..31fdf51 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 @@ -0,0 +1,24 @@ +$ErrorActionPreference = 'Stop' + +$url = $args[0] + +Write-Host "Downloading Microsoft Edge" +$wc = New-Object net.webclient +$msiInstaller = "$env:temp\microsoft-edge-stable.msi" +$wc.Downloadfile($url, $msiInstaller) + +Write-Host "Installing Microsoft Edge" +$arguments = "/i `"$msiInstaller`" /quiet" +Start-Process msiexec.exe -ArgumentList $arguments -Wait +Remove-Item $msiInstaller + +$suffix = "\\Microsoft\\Edge\\Application\\msedge.exe" +if (Test-Path "${env:ProgramFiles(x86)}$suffix") { + (Get-Item "${env:ProgramFiles(x86)}$suffix").VersionInfo +} elseif (Test-Path "${env:ProgramFiles}$suffix") { + (Get-Item "${env:ProgramFiles}$suffix").VersionInfo +} else { + Write-Host "ERROR: Failed to install Microsoft Edge." + Write-Host "ERROR: This could be due to insufficient privileges, in which case re-running as Administrator may help." + exit 1 +} \ No newline at end of file diff --git a/tools/e2e/node_modules/playwright-core/browsers.json b/tools/e2e/node_modules/playwright-core/browsers.json new file mode 100644 index 0000000..25e42ea --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/browsers.json @@ -0,0 +1,75 @@ +{ + "comment": "Do not edit this file, use utils/roll_browser.js", + "browsers": [ + { + "name": "chromium", + "revision": "1234", + "installByDefault": true, + "browserVersion": "151.0.7922.34", + "title": "Chrome for Testing" + }, + { + "name": "chromium-headless-shell", + "revision": "1234", + "installByDefault": true, + "browserVersion": "151.0.7922.34", + "title": "Chrome Headless Shell" + }, + { + "name": "chromium-tip-of-tree", + "revision": "1433", + "installByDefault": false, + "browserVersion": "151.0.7893.0", + "title": "Chrome Canary for Testing" + }, + { + "name": "chromium-tip-of-tree-headless-shell", + "revision": "1433", + "installByDefault": false, + "browserVersion": "151.0.7893.0", + "title": "Chrome Canary Headless Shell" + }, + { + "name": "firefox", + "revision": "1538", + "installByDefault": true, + "browserVersion": "153.0", + "title": "Firefox" + }, + { + "name": "firefox-beta", + "revision": "1526", + "installByDefault": false, + "browserVersion": "152.0b1", + "title": "Firefox Beta" + }, + { + "name": "webkit", + "revision": "2336", + "installByDefault": true, + "revisionOverrides": { + "mac14": "2251", + "mac14-arm64": "2251", + "ubuntu20.04-x64": "2092", + "ubuntu20.04-arm64": "2092" + }, + "browserVersion": "26.5", + "title": "WebKit" + }, + { + "name": "ffmpeg", + "revision": "1011", + "installByDefault": true + }, + { + "name": "winldd", + "revision": "1007", + "installByDefault": false + }, + { + "name": "android", + "revision": "1001", + "installByDefault": false + } + ] +} diff --git a/tools/e2e/node_modules/playwright-core/cli.js b/tools/e2e/node_modules/playwright-core/cli.js new file mode 100755 index 0000000..f275a03 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/cli.js @@ -0,0 +1,21 @@ +#!/usr/bin/env node +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const { libCli, libCliTestStub } = require('./lib/coreBundle'); +const { program } = require('./lib/utilsBundle'); +libCli.decorateProgram(program); +libCliTestStub.decorateProgram(program); +program.parse(process.argv); diff --git a/tools/e2e/node_modules/playwright-core/index.d.ts b/tools/e2e/node_modules/playwright-core/index.d.ts new file mode 100644 index 0000000..97c1493 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/index.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './types/types'; diff --git a/tools/e2e/node_modules/playwright-core/index.js b/tools/e2e/node_modules/playwright-core/index.js new file mode 100644 index 0000000..9fc51a4 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/index.js @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +require('./lib/bootstrap'); +module.exports = require('./lib/coreBundle').inprocess.playwright; diff --git a/tools/e2e/node_modules/playwright-core/index.mjs b/tools/e2e/node_modules/playwright-core/index.mjs new file mode 100644 index 0000000..3b3c75b --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/index.mjs @@ -0,0 +1,28 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import playwright from './index.js'; + +export const chromium = playwright.chromium; +export const firefox = playwright.firefox; +export const webkit = playwright.webkit; +export const selectors = playwright.selectors; +export const devices = playwright.devices; +export const errors = playwright.errors; +export const request = playwright.request; +export const _electron = playwright._electron; +export const _android = playwright._android; +export default playwright; diff --git a/tools/e2e/node_modules/playwright-core/lib/bootstrap.js b/tools/e2e/node_modules/playwright-core/lib/bootstrap.js new file mode 100644 index 0000000..3654bb8 --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/lib/bootstrap.js @@ -0,0 +1,88 @@ +"use strict"; +const minimumMajorNodeVersion = 20; +const currentNodeVersion = process.versions.node; +const major = +currentNodeVersion.split(".")[0]; +if (major < minimumMajorNodeVersion) { + console.error( + "You are running Node.js " + currentNodeVersion + `. +Playwright requires Node.js ${minimumMajorNodeVersion} or higher. +Please update your version of Node.js.` + ); + process.exit(1); +} +if (process.env.PW_INSTRUMENT_MODULES) { + const Module = require("module"); + const originalLoad = Module._load; + const root = { name: "", selfMs: 0, totalMs: 0, childrenMs: 0, children: [] }; + let current = root; + const stack = []; + Module._load = function(request, _parent, _isMain) { + const node = { name: request, selfMs: 0, totalMs: 0, childrenMs: 0, children: [] }; + current.children.push(node); + stack.push(current); + current = node; + const start = performance.now(); + let result; + try { + result = originalLoad.apply(this, arguments); + } catch (e) { + current = stack.pop(); + current.children.pop(); + throw e; + } + const duration = performance.now() - start; + node.totalMs = duration; + node.selfMs = Math.max(0, duration - node.childrenMs); + current = stack.pop(); + current.childrenMs += duration; + return result; + }; + process.on("exit", () => { + function printTree(node, prefix, isLast, lines2, depth) { + if (node.totalMs < 1 && depth > 0) + return; + const connector = depth === 0 ? "" : isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 "; + const time = `${node.totalMs.toFixed(1).padStart(8)}ms`; + const self = node.children.length ? ` (self: ${node.selfMs.toFixed(1)}ms)` : ""; + lines2.push(`${time} ${prefix}${connector}${node.name}${self}`); + const childPrefix = prefix + (depth === 0 ? "" : isLast ? " " : "\u2502 "); + const sorted2 = node.children.slice().sort((a, b) => b.totalMs - a.totalMs); + for (let i = 0; i < sorted2.length; i++) + printTree(sorted2[i], childPrefix, i === sorted2.length - 1, lines2, depth + 1); + } + let totalModules = 0; + function count(n) { + totalModules++; + n.children.forEach(count); + } + root.children.forEach(count); + const lines = []; + const sorted = root.children.slice().sort((a, b) => b.totalMs - a.totalMs); + for (let i = 0; i < sorted.length; i++) + printTree(sorted[i], "", i === sorted.length - 1, lines, 0); + const totalMs = root.children.reduce((s, c) => s + c.totalMs, 0); + process.stderr.write(` +--- Module load tree: ${totalModules} modules, ${totalMs.toFixed(0)}ms total --- +` + lines.join("\n") + "\n"); + const flat = /* @__PURE__ */ new Map(); + function gather(n) { + const existing = flat.get(n.name); + if (existing) { + existing.selfMs += n.selfMs; + existing.totalMs += n.totalMs; + existing.count++; + } else { + flat.set(n.name, { selfMs: n.selfMs, totalMs: n.totalMs, count: 1 }); + } + n.children.forEach(gather); + } + root.children.forEach(gather); + const top50 = [...flat.entries()].sort((a, b) => b[1].selfMs - a[1].selfMs).slice(0, 50); + const flatLines = top50.map( + ([mod, { selfMs, totalMs: totalMs2, count: count2 }]) => `${selfMs.toFixed(1).padStart(8)}ms self ${totalMs2.toFixed(1).padStart(8)}ms total (x${String(count2).padStart(3)}) ${mod}` + ); + process.stderr.write(` +--- Top 50 modules by self time --- +` + flatLines.join("\n") + "\n"); + }); +} diff --git a/tools/e2e/node_modules/playwright-core/lib/coreBundle.js b/tools/e2e/node_modules/playwright-core/lib/coreBundle.js new file mode 100644 index 0000000..d9041dd --- /dev/null +++ b/tools/e2e/node_modules/playwright-core/lib/coreBundle.js @@ -0,0 +1,74830 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __esm = (fn, res, err) => function __init() { + if (err) throw err[0]; + try { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; + } catch (e) { + throw err = [e], e; + } +}; +var __commonJS = (cb, mod) => function __require() { + try { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; + } catch (e) { + throw mod = 0, e; + } +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// packages/isomorphic/ariaSnapshot.ts +function hasPointerCursor(ariaNode) { + return ariaNode.box.cursor === "pointer"; +} +function parseAriaSnapshotUnsafe(yaml3, text2, options = {}) { + const result2 = parseAriaSnapshot(yaml3, text2, options); + if (result2.errors.length) + throw new Error(result2.errors[0].message); + return result2.fragment; +} +function parseAriaSnapshot(yaml3, text2, options = {}) { + const lineCounter = new yaml3.LineCounter(); + const parseOptions = { + keepSourceTokens: true, + lineCounter, + ...options + }; + const yamlDoc = yaml3.parseDocument(text2, parseOptions); + const errors = []; + const convertRange = (range) => { + return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])]; + }; + const addError = (error) => { + errors.push({ + message: error.message, + range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])] + }); + }; + const convertSeq = (container, seq) => { + for (const item of seq.items) { + const itemIsString = item instanceof yaml3.Scalar && typeof item.value === "string"; + if (itemIsString) { + const childNode = KeyParser.parse(item, parseOptions, errors); + if (childNode) { + container.children = container.children || []; + container.children.push(childNode); + } + continue; + } + const itemIsMap = item instanceof yaml3.YAMLMap; + if (itemIsMap) { + convertMap(container, item); + continue; + } + errors.push({ + message: "Sequence items should be strings or maps", + range: convertRange(item.range || seq.range) + }); + } + }; + const convertMap = (container, map) => { + for (const entry of map.items) { + container.children = container.children || []; + const keyIsString = entry.key instanceof yaml3.Scalar && typeof entry.key.value === "string"; + if (!keyIsString) { + errors.push({ + message: "Only string keys are supported", + range: convertRange(entry.key.range || map.range) + }); + continue; + } + const key = entry.key; + const value2 = entry.value; + if (key.value === "text") { + const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string"; + if (!valueIsString) { + errors.push({ + message: "Text value should be a string", + range: convertRange(entry.value.range || map.range) + }); + continue; + } + container.children.push({ + kind: "text", + text: textValue(value2.value) + }); + continue; + } + if (key.value === "/children") { + const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string"; + if (!valueIsString || value2.value !== "contain" && value2.value !== "equal" && value2.value !== "deep-equal") { + errors.push({ + message: 'Strict value should be "contain", "equal" or "deep-equal"', + range: convertRange(entry.value.range || map.range) + }); + continue; + } + container.containerMode = value2.value; + continue; + } + if (key.value.startsWith("/")) { + const valueIsString = value2 instanceof yaml3.Scalar && typeof value2.value === "string"; + if (!valueIsString) { + errors.push({ + message: "Property value should be a string", + range: convertRange(entry.value.range || map.range) + }); + continue; + } + container.props = container.props ?? {}; + container.props[key.value.slice(1)] = textValue(value2.value); + continue; + } + const childNode = KeyParser.parse(key, parseOptions, errors); + if (!childNode) + continue; + const valueIsScalar = value2 instanceof yaml3.Scalar; + if (valueIsScalar) { + const type3 = typeof value2.value; + if (type3 !== "string" && type3 !== "number" && type3 !== "boolean") { + errors.push({ + message: "Node value should be a string or a sequence", + range: convertRange(entry.value.range || map.range) + }); + continue; + } + container.children.push({ + ...childNode, + children: [{ + kind: "text", + text: textValue(String(value2.value)) + }] + }); + continue; + } + const valueIsSequence = value2 instanceof yaml3.YAMLSeq; + if (valueIsSequence) { + container.children.push(childNode); + convertSeq(childNode, value2); + continue; + } + errors.push({ + message: "Map values should be strings or sequences", + range: convertRange(entry.value.range || map.range) + }); + } + }; + const fragment = { kind: "role", role: "fragment" }; + yamlDoc.errors.forEach(addError); + if (errors.length) + return { errors, fragment }; + if (!(yamlDoc.contents instanceof yaml3.YAMLSeq)) { + errors.push({ + message: 'Aria snapshot must be a YAML sequence, elements starting with " -"', + range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }] + }); + } + if (errors.length) + return { errors, fragment }; + convertSeq(fragment, yamlDoc.contents); + if (errors.length) + return { errors, fragment: emptyFragment }; + if (fragment.children?.length === 1 && (!fragment.containerMode || fragment.containerMode === "contain")) + return { fragment: fragment.children[0], errors: [] }; + return { fragment, errors: [] }; +} +function normalizeWhitespace(text2) { + return text2.replace(/[\u200b\u00ad]/g, "").replace(/[\r\n\s\t]+/g, " ").trim(); +} +function textValue(value2) { + return { + raw: value2, + normalized: normalizeWhitespace(value2) + }; +} +function findNewNode(from, to) { + function fillMap(root, map, position) { + let size = 1; + let childPosition = position + size; + for (const child of root.children || []) { + if (typeof child === "string") { + size++; + childPosition++; + } else { + size += fillMap(child, map, childPosition); + childPosition += size; + } + } + if (!["none", "presentation", "fragment", "iframe", "generic"].includes(root.role) && root.name) { + let byRole = map.get(root.role); + if (!byRole) { + byRole = /* @__PURE__ */ new Map(); + map.set(root.role, byRole); + } + const existing = byRole.get(root.name); + const sizeAndPosition = size * 100 - position; + if (!existing || existing.sizeAndPosition < sizeAndPosition) + byRole.set(root.name, { node: root, sizeAndPosition }); + } + return size; + } + const fromMap = /* @__PURE__ */ new Map(); + if (from) + fillMap(from, fromMap, 0); + const toMap = /* @__PURE__ */ new Map(); + fillMap(to, toMap, 0); + const result2 = []; + for (const [role, byRole] of toMap) { + for (const [name, byName] of byRole) { + const inFrom = fromMap.get(role)?.get(name); + if (!inFrom) + result2.push(byName); + } + } + result2.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition); + return result2[0]?.node; +} +var emptyFragment, KeyParser, ParserError; +var init_ariaSnapshot = __esm({ + "packages/isomorphic/ariaSnapshot.ts"() { + "use strict"; + emptyFragment = { kind: "role", role: "fragment" }; + KeyParser = class _KeyParser { + static parse(text2, options, errors) { + try { + return new _KeyParser(text2.value)._parse(); + } catch (e) { + if (e instanceof ParserError) { + const message = options.prettyErrors === false ? e.message : e.message + ":\n\n" + text2.value + "\n" + " ".repeat(e.pos) + "^\n"; + errors.push({ + message, + range: [options.lineCounter.linePos(text2.range[0]), options.lineCounter.linePos(text2.range[0] + e.pos)] + }); + return null; + } + throw e; + } + } + constructor(input) { + this._input = input; + this._pos = 0; + this._length = input.length; + } + _peek() { + return this._input[this._pos] || ""; + } + _next() { + if (this._pos < this._length) + return this._input[this._pos++]; + return null; + } + _eof() { + return this._pos >= this._length; + } + _isWhitespace() { + return !this._eof() && /\s/.test(this._peek()); + } + _skipWhitespace() { + while (this._isWhitespace()) + this._pos++; + } + _readIdentifier(type3) { + if (this._eof()) + this._throwError(`Unexpected end of input when expecting ${type3}`); + const start3 = this._pos; + while (!this._eof() && /[a-zA-Z]/.test(this._peek())) + this._pos++; + return this._input.slice(start3, this._pos); + } + _readString() { + let result2 = ""; + let escaped2 = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped2) { + result2 += ch; + escaped2 = false; + } else if (ch === "\\") { + escaped2 = true; + } else if (ch === '"') { + return result2; + } else { + result2 += ch; + } + } + this._throwError("Unterminated string"); + } + _throwError(message, offset = 0) { + throw new ParserError(message, offset || this._pos); + } + _readRegex() { + let result2 = ""; + let escaped2 = false; + let insideClass = false; + while (!this._eof()) { + const ch = this._next(); + if (escaped2) { + result2 += ch; + escaped2 = false; + } else if (ch === "\\") { + escaped2 = true; + result2 += ch; + } else if (ch === "/" && !insideClass) { + return { pattern: result2 }; + } else if (ch === "[") { + insideClass = true; + result2 += ch; + } else if (ch === "]" && insideClass) { + result2 += ch; + insideClass = false; + } else { + result2 += ch; + } + } + this._throwError("Unterminated regex"); + } + _readStringOrRegex() { + const ch = this._peek(); + if (ch === '"') { + this._next(); + return normalizeWhitespace(this._readString()); + } + if (ch === "/") { + this._next(); + return this._readRegex(); + } + return null; + } + _readAttributes(result2) { + let errorPos = this._pos; + while (true) { + this._skipWhitespace(); + if (this._peek() === "[") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + const flagName = this._readIdentifier("attribute"); + this._skipWhitespace(); + let flagValue = ""; + if (this._peek() === "=") { + this._next(); + this._skipWhitespace(); + errorPos = this._pos; + while (this._peek() !== "]" && !this._isWhitespace() && !this._eof()) + flagValue += this._next(); + } + this._skipWhitespace(); + if (this._peek() !== "]") + this._throwError("Expected ]"); + this._next(); + this._applyAttribute(result2, flagName, flagValue || "true", errorPos); + } else { + break; + } + } + } + _parse() { + this._skipWhitespace(); + const role = this._readIdentifier("role"); + this._skipWhitespace(); + const name = this._readStringOrRegex() || ""; + const result2 = { kind: "role", role, name }; + this._readAttributes(result2); + this._skipWhitespace(); + if (!this._eof()) + this._throwError("Unexpected input"); + return result2; + } + _applyAttribute(node, key, value2, errorPos) { + if (key === "checked") { + this._assert(value2 === "true" || value2 === "false" || value2 === "mixed", 'Value of "checked" attribute must be a boolean or "mixed"', errorPos); + node.checked = value2 === "true" ? true : value2 === "false" ? false : "mixed"; + return; + } + if (key === "disabled") { + this._assert(value2 === "true" || value2 === "false", 'Value of "disabled" attribute must be a boolean', errorPos); + node.disabled = value2 === "true"; + return; + } + if (key === "expanded") { + this._assert(value2 === "true" || value2 === "false", 'Value of "expanded" attribute must be a boolean', errorPos); + node.expanded = value2 === "true"; + return; + } + if (key === "active") { + this._assert(value2 === "true" || value2 === "false", 'Value of "active" attribute must be a boolean', errorPos); + node.active = value2 === "true"; + return; + } + if (key === "invalid") { + this._assert(value2 === "true" || value2 === "false" || value2 === "grammar" || value2 === "spelling", 'Value of "invalid" attribute must be a boolean, "grammar" or "spelling"', errorPos); + node.invalid = value2 === "true" ? true : value2 === "false" ? false : value2; + return; + } + if (key === "level") { + this._assert(!isNaN(Number(value2)), 'Value of "level" attribute must be a number', errorPos); + node.level = Number(value2); + return; + } + if (key === "pressed") { + this._assert(value2 === "true" || value2 === "false" || value2 === "mixed", 'Value of "pressed" attribute must be a boolean or "mixed"', errorPos); + node.pressed = value2 === "true" ? true : value2 === "false" ? false : "mixed"; + return; + } + if (key === "selected") { + this._assert(value2 === "true" || value2 === "false", 'Value of "selected" attribute must be a boolean', errorPos); + node.selected = value2 === "true"; + return; + } + this._assert(false, `Unsupported attribute [${key}]`, errorPos); + } + _assert(value2, message, valuePos) { + if (!value2) + this._throwError(message || "Assertion error", valuePos); + } + }; + ParserError = class extends Error { + constructor(message, pos) { + super(message); + this.pos = pos; + } + }; + } +}); + +// packages/isomorphic/assert.ts +function assert(value2, message) { + if (!value2) + throw new Error(message || "Assertion error"); +} +var init_assert = __esm({ + "packages/isomorphic/assert.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/base64.ts +function base64ByteLength(data) { + if (!data) + return 0; + const padding = data[data.length - 2] === "=" ? 2 : data[data.length - 1] === "=" ? 1 : 0; + return Math.max(0, Math.floor(data.length * 3 / 4) - padding); +} +var init_base64 = __esm({ + "packages/isomorphic/base64.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/colors.ts +var webColors, noColors, applyStyle; +var init_colors = __esm({ + "packages/isomorphic/colors.ts"() { + "use strict"; + webColors = { + enabled: true, + reset: (text2) => applyStyle(0, 0, text2), + bold: (text2) => applyStyle(1, 22, text2), + dim: (text2) => applyStyle(2, 22, text2), + italic: (text2) => applyStyle(3, 23, text2), + underline: (text2) => applyStyle(4, 24, text2), + inverse: (text2) => applyStyle(7, 27, text2), + hidden: (text2) => applyStyle(8, 28, text2), + strikethrough: (text2) => applyStyle(9, 29, text2), + black: (text2) => applyStyle(30, 39, text2), + red: (text2) => applyStyle(31, 39, text2), + green: (text2) => applyStyle(32, 39, text2), + yellow: (text2) => applyStyle(33, 39, text2), + blue: (text2) => applyStyle(34, 39, text2), + magenta: (text2) => applyStyle(35, 39, text2), + cyan: (text2) => applyStyle(36, 39, text2), + white: (text2) => applyStyle(37, 39, text2), + gray: (text2) => applyStyle(90, 39, text2), + grey: (text2) => applyStyle(90, 39, text2) + }; + noColors = { + enabled: false, + reset: (t) => t, + bold: (t) => t, + dim: (t) => t, + italic: (t) => t, + underline: (t) => t, + inverse: (t) => t, + hidden: (t) => t, + strikethrough: (t) => t, + black: (t) => t, + red: (t) => t, + green: (t) => t, + yellow: (t) => t, + blue: (t) => t, + magenta: (t) => t, + cyan: (t) => t, + white: (t) => t, + gray: (t) => t, + grey: (t) => t + }; + applyStyle = (open5, close3, text2) => `\x1B[${open5}m${text2}\x1B[${close3}m`; + } +}); + +// packages/isomorphic/headers.ts +function headersObjectToArray(headers, separator, setCookieSeparator) { + if (!setCookieSeparator) + setCookieSeparator = separator; + const result2 = []; + for (const name in headers) { + const values = headers[name]; + if (values === void 0) + continue; + if (separator) { + const sep = name.toLowerCase() === "set-cookie" ? setCookieSeparator : separator; + for (const value2 of values.split(sep)) + result2.push({ name, value: value2.trim() }); + } else { + result2.push({ name, value: values }); + } + } + return result2; +} +function headersArrayToObject(headers, lowerCase) { + const result2 = {}; + for (const { name, value: value2 } of headers) + result2[lowerCase ? name.toLowerCase() : name] = value2; + return result2; +} +var init_headers = __esm({ + "packages/isomorphic/headers.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/imageUtils.ts +function padImageToSize(image, size) { + if (image.width === size.width && image.height === size.height) + return image; + const buffer = new Uint8Array(size.width * size.height * 4); + for (let y = 0; y < size.height; y++) { + for (let x = 0; x < size.width; x++) { + const to = (y * size.width + x) * 4; + if (y < image.height && x < image.width) { + const from = (y * image.width + x) * 4; + buffer[to] = image.data[from]; + buffer[to + 1] = image.data[from + 1]; + buffer[to + 2] = image.data[from + 2]; + buffer[to + 3] = image.data[from + 3]; + } else { + buffer[to] = 0; + buffer[to + 1] = 0; + buffer[to + 2] = 0; + buffer[to + 3] = 0; + } + } + } + return { data: Buffer.from(buffer), width: size.width, height: size.height }; +} +function scaleImageToSize(image, size) { + const { data: src, width: w1, height: h1 } = image; + const w2 = Math.max(1, Math.floor(size.width)); + const h2 = Math.max(1, Math.floor(size.height)); + if (w1 === w2 && h1 === h2) + return image; + if (w1 <= 0 || h1 <= 0) + throw new Error("Invalid input image"); + if (size.width <= 0 || size.height <= 0 || !isFinite(size.width) || !isFinite(size.height)) + throw new Error("Invalid output dimensions"); + const clamp = (v, lo, hi) => v < lo ? lo : v > hi ? hi : v; + const weights = (t, o) => { + const t2 = t * t; + const t3 = t2 * t; + o[0] = -0.5 * t + 1 * t2 - 0.5 * t3; + o[1] = 1 - 2.5 * t2 + 1.5 * t3; + o[2] = 0.5 * t + 2 * t2 - 1.5 * t3; + o[3] = -0.5 * t2 + 0.5 * t3; + }; + const srcRowStride = w1 * 4; + const dstRowStride = w2 * 4; + const xOff = new Int32Array(w2 * 4); + const xW = new Float32Array(w2 * 4); + const wx = new Float32Array(4); + const xScale = w1 / w2; + for (let x = 0; x < w2; x++) { + const sx = (x + 0.5) * xScale - 0.5; + const sxi = Math.floor(sx); + const t = sx - sxi; + weights(t, wx); + const b = x * 4; + const i0 = clamp(sxi - 1, 0, w1 - 1); + const i1 = clamp(sxi + 0, 0, w1 - 1); + const i2 = clamp(sxi + 1, 0, w1 - 1); + const i3 = clamp(sxi + 2, 0, w1 - 1); + xOff[b + 0] = i0 << 2; + xOff[b + 1] = i1 << 2; + xOff[b + 2] = i2 << 2; + xOff[b + 3] = i3 << 2; + xW[b + 0] = wx[0]; + xW[b + 1] = wx[1]; + xW[b + 2] = wx[2]; + xW[b + 3] = wx[3]; + } + const yRow = new Int32Array(h2 * 4); + const yW = new Float32Array(h2 * 4); + const wy = new Float32Array(4); + const yScale = h1 / h2; + for (let y = 0; y < h2; y++) { + const sy = (y + 0.5) * yScale - 0.5; + const syi = Math.floor(sy); + const t = sy - syi; + weights(t, wy); + const b = y * 4; + const j0 = clamp(syi - 1, 0, h1 - 1); + const j1 = clamp(syi + 0, 0, h1 - 1); + const j2 = clamp(syi + 1, 0, h1 - 1); + const j3 = clamp(syi + 2, 0, h1 - 1); + yRow[b + 0] = j0 * srcRowStride; + yRow[b + 1] = j1 * srcRowStride; + yRow[b + 2] = j2 * srcRowStride; + yRow[b + 3] = j3 * srcRowStride; + yW[b + 0] = wy[0]; + yW[b + 1] = wy[1]; + yW[b + 2] = wy[2]; + yW[b + 3] = wy[3]; + } + const dst = new Uint8Array(w2 * h2 * 4); + for (let y = 0; y < h2; y++) { + const yb = y * 4; + const rb0 = yRow[yb + 0]; + const rb1 = yRow[yb + 1]; + const rb2 = yRow[yb + 2]; + const rb3 = yRow[yb + 3]; + const wy0 = yW[yb + 0]; + const wy1 = yW[yb + 1]; + const wy2 = yW[yb + 2]; + const wy3 = yW[yb + 3]; + const dstBase = y * dstRowStride; + for (let x = 0; x < w2; x++) { + const xb = x * 4; + const xo0 = xOff[xb + 0]; + const xo1 = xOff[xb + 1]; + const xo2 = xOff[xb + 2]; + const xo3 = xOff[xb + 3]; + const wx0 = xW[xb + 0]; + const wx1 = xW[xb + 1]; + const wx2 = xW[xb + 2]; + const wx3 = xW[xb + 3]; + const di = dstBase + (x << 2); + for (let c = 0; c < 4; c++) { + const r0 = src[rb0 + xo0 + c] * wx0 + src[rb0 + xo1 + c] * wx1 + src[rb0 + xo2 + c] * wx2 + src[rb0 + xo3 + c] * wx3; + const r1 = src[rb1 + xo0 + c] * wx0 + src[rb1 + xo1 + c] * wx1 + src[rb1 + xo2 + c] * wx2 + src[rb1 + xo3 + c] * wx3; + const r2 = src[rb2 + xo0 + c] * wx0 + src[rb2 + xo1 + c] * wx1 + src[rb2 + xo2 + c] * wx2 + src[rb2 + xo3 + c] * wx3; + const r3 = src[rb3 + xo0 + c] * wx0 + src[rb3 + xo1 + c] * wx1 + src[rb3 + xo2 + c] * wx2 + src[rb3 + xo3 + c] * wx3; + const v = r0 * wy0 + r1 * wy1 + r2 * wy2 + r3 * wy3; + dst[di + c] = v < 0 ? 0 : v > 255 ? 255 : v | 0; + } + } + } + return { data: Buffer.from(dst.buffer), width: w2, height: h2 }; +} +var init_imageUtils = __esm({ + "packages/isomorphic/imageUtils.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/jsonSchema.ts +function validate(value2, schema, path66) { + const errors = []; + if (schema.oneOf) { + let bestErrors; + for (const variant of schema.oneOf) { + const variantErrors = validate(value2, variant, path66); + if (variantErrors.length === 0) + return []; + if (!bestErrors || variantErrors.length < bestErrors.length) + bestErrors = variantErrors; + } + if (bestErrors.length === 1 && bestErrors[0].startsWith(`${path66}: expected `)) + return [`${path66}: does not match any of the expected types`]; + return bestErrors; + } + if (schema.type === "string") { + if (typeof value2 !== "string") { + errors.push(`${path66}: expected string, got ${typeof value2}`); + return errors; + } + if (schema.pattern && !cachedRegex(schema.pattern).test(value2)) + errors.push(schema.patternError || `${path66}: must match pattern "${schema.pattern}"`); + return errors; + } + if (schema.type === "array") { + if (!Array.isArray(value2)) { + errors.push(`${path66}: expected array, got ${typeof value2}`); + return errors; + } + if (schema.items) { + for (let i = 0; i < value2.length; i++) + errors.push(...validate(value2[i], schema.items, `${path66}[${i}]`)); + } + return errors; + } + if (schema.type === "object") { + if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) { + errors.push(`${path66}: expected object, got ${Array.isArray(value2) ? "array" : typeof value2}`); + return errors; + } + const obj = value2; + for (const key of schema.required || []) { + if (obj[key] === void 0) + errors.push(`${path66}.${key}: required`); + } + for (const [key, propSchema] of Object.entries(schema.properties || {})) { + if (obj[key] !== void 0) + errors.push(...validate(obj[key], propSchema, `${path66}.${key}`)); + } + return errors; + } + return errors; +} +function cachedRegex(pattern) { + let regex = regexCache.get(pattern); + if (!regex) { + regex = new RegExp(pattern); + regexCache.set(pattern, regex); + } + return regex; +} +var regexCache; +var init_jsonSchema = __esm({ + "packages/isomorphic/jsonSchema.ts"() { + "use strict"; + regexCache = /* @__PURE__ */ new Map(); + } +}); + +// packages/isomorphic/cssTokenizer.ts +function digit(code) { + return between(code, 48, 57); +} +function hexdigit(code) { + return digit(code) || between(code, 65, 70) || between(code, 97, 102); +} +function uppercaseletter(code) { + return between(code, 65, 90); +} +function lowercaseletter(code) { + return between(code, 97, 122); +} +function letter(code) { + return uppercaseletter(code) || lowercaseletter(code); +} +function nonascii(code) { + return code >= 128; +} +function namestartchar(code) { + return letter(code) || nonascii(code) || code === 95; +} +function namechar(code) { + return namestartchar(code) || digit(code) || code === 45; +} +function nonprintable(code) { + return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127; +} +function newline(code) { + return code === 10; +} +function whitespace(code) { + return newline(code) || code === 9 || code === 32; +} +function preprocess(str) { + const codepoints = []; + for (let i = 0; i < str.length; i++) { + let code = str.charCodeAt(i); + if (code === 13 && str.charCodeAt(i + 1) === 10) { + code = 10; + i++; + } + if (code === 13 || code === 12) + code = 10; + if (code === 0) + code = 65533; + if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) { + const lead = code - 55296; + const trail = str.charCodeAt(i + 1) - 56320; + code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail; + i++; + } + codepoints.push(code); + } + return codepoints; +} +function stringFromCode(code) { + if (code <= 65535) + return String.fromCharCode(code); + code -= Math.pow(2, 16); + const lead = Math.floor(code / Math.pow(2, 10)) + 55296; + const trail = code % Math.pow(2, 10) + 56320; + return String.fromCharCode(lead) + String.fromCharCode(trail); +} +function tokenize(str1) { + const str = preprocess(str1); + let i = -1; + const tokens = []; + let code; + let line = 0; + let column = 0; + let lastLineLength = 0; + const incrLineno = function() { + line += 1; + lastLineLength = column; + column = 0; + }; + const locStart = { line, column }; + const codepoint = function(i2) { + if (i2 >= str.length) + return -1; + return str[i2]; + }; + const next = function(num) { + if (num === void 0) + num = 1; + if (num > 3) + throw "Spec Error: no more than three codepoints of lookahead."; + return codepoint(i + num); + }; + const consume = function(num) { + if (num === void 0) + num = 1; + i += num; + code = codepoint(i); + if (newline(code)) + incrLineno(); + else + column += num; + return true; + }; + const reconsume = function() { + i -= 1; + if (newline(code)) { + line -= 1; + column = lastLineLength; + } else { + column -= 1; + } + locStart.line = line; + locStart.column = column; + return true; + }; + const eof = function(codepoint2) { + if (codepoint2 === void 0) + codepoint2 = code; + return codepoint2 === -1; + }; + const donothing = function() { + }; + const parseerror = function() { + }; + const consumeAToken = function() { + consumeComments(); + consume(); + if (whitespace(code)) { + while (whitespace(next())) + consume(); + return new WhitespaceToken(); + } else if (code === 34) { + return consumeAStringToken(); + } else if (code === 35) { + if (namechar(next()) || areAValidEscape(next(1), next(2))) { + const token = new HashToken(""); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + token.type = "id"; + token.value = consumeAName(); + return token; + } else { + return new DelimToken(code); + } + } else if (code === 36) { + if (next() === 61) { + consume(); + return new SuffixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 39) { + return consumeAStringToken(); + } else if (code === 40) { + return new OpenParenToken(); + } else if (code === 41) { + return new CloseParenToken(); + } else if (code === 42) { + if (next() === 61) { + consume(); + return new SubstringMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 43) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 44) { + return new CommaToken(); + } else if (code === 45) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else if (next(1) === 45 && next(2) === 62) { + consume(2); + return new CDCToken(); + } else if (startsWithAnIdentifier()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + return new DelimToken(code); + } + } else if (code === 46) { + if (startsWithANumber()) { + reconsume(); + return consumeANumericToken(); + } else { + return new DelimToken(code); + } + } else if (code === 58) { + return new ColonToken(); + } else if (code === 59) { + return new SemicolonToken(); + } else if (code === 60) { + if (next(1) === 33 && next(2) === 45 && next(3) === 45) { + consume(3); + return new CDOToken(); + } else { + return new DelimToken(code); + } + } else if (code === 64) { + if (wouldStartAnIdentifier(next(1), next(2), next(3))) + return new AtKeywordToken(consumeAName()); + else + return new DelimToken(code); + } else if (code === 91) { + return new OpenSquareToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + reconsume(); + return consumeAnIdentlikeToken(); + } else { + parseerror(); + return new DelimToken(code); + } + } else if (code === 93) { + return new CloseSquareToken(); + } else if (code === 94) { + if (next() === 61) { + consume(); + return new PrefixMatchToken(); + } else { + return new DelimToken(code); + } + } else if (code === 123) { + return new OpenCurlyToken(); + } else if (code === 124) { + if (next() === 61) { + consume(); + return new DashMatchToken(); + } else if (next() === 124) { + consume(); + return new ColumnToken(); + } else { + return new DelimToken(code); + } + } else if (code === 125) { + return new CloseCurlyToken(); + } else if (code === 126) { + if (next() === 61) { + consume(); + return new IncludeMatchToken(); + } else { + return new DelimToken(code); + } + } else if (digit(code)) { + reconsume(); + return consumeANumericToken(); + } else if (namestartchar(code)) { + reconsume(); + return consumeAnIdentlikeToken(); + } else if (eof()) { + return new EOFToken(); + } else { + return new DelimToken(code); + } + }; + const consumeComments = function() { + while (next(1) === 47 && next(2) === 42) { + consume(2); + while (true) { + consume(); + if (code === 42 && next() === 47) { + consume(); + break; + } else if (eof()) { + parseerror(); + return; + } + } + } + }; + const consumeANumericToken = function() { + const num = consumeANumber(); + if (wouldStartAnIdentifier(next(1), next(2), next(3))) { + const token = new DimensionToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + token.unit = consumeAName(); + return token; + } else if (next() === 37) { + consume(); + const token = new PercentageToken(); + token.value = num.value; + token.repr = num.repr; + return token; + } else { + const token = new NumberToken(); + token.value = num.value; + token.repr = num.repr; + token.type = num.type; + return token; + } + }; + const consumeAnIdentlikeToken = function() { + const str2 = consumeAName(); + if (str2.toLowerCase() === "url" && next() === 40) { + consume(); + while (whitespace(next(1)) && whitespace(next(2))) + consume(); + if (next() === 34 || next() === 39) + return new FunctionToken(str2); + else if (whitespace(next()) && (next(2) === 34 || next(2) === 39)) + return new FunctionToken(str2); + else + return consumeAURLToken(); + } else if (next() === 40) { + consume(); + return new FunctionToken(str2); + } else { + return new IdentToken(str2); + } + }; + const consumeAStringToken = function(endingCodePoint) { + if (endingCodePoint === void 0) + endingCodePoint = code; + let string = ""; + while (consume()) { + if (code === endingCodePoint || eof()) { + return new StringToken(string); + } else if (newline(code)) { + parseerror(); + reconsume(); + return new BadStringToken(); + } else if (code === 92) { + if (eof(next())) + donothing(); + else if (newline(next())) + consume(); + else + string += stringFromCode(consumeEscape()); + } else { + string += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeAURLToken = function() { + const token = new URLToken(""); + while (whitespace(next())) + consume(); + if (eof(next())) + return token; + while (consume()) { + if (code === 41 || eof()) { + return token; + } else if (whitespace(code)) { + while (whitespace(next())) + consume(); + if (next() === 41 || eof(next())) { + consume(); + return token; + } else { + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) { + parseerror(); + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } else if (code === 92) { + if (startsWithAValidEscape()) { + token.value += stringFromCode(consumeEscape()); + } else { + parseerror(); + consumeTheRemnantsOfABadURL(); + return new BadURLToken(); + } + } else { + token.value += stringFromCode(code); + } + } + throw new Error("Internal error"); + }; + const consumeEscape = function() { + consume(); + if (hexdigit(code)) { + const digits = [code]; + for (let total = 0; total < 5; total++) { + if (hexdigit(next())) { + consume(); + digits.push(code); + } else { + break; + } + } + if (whitespace(next())) + consume(); + let value2 = parseInt(digits.map(function(x) { + return String.fromCharCode(x); + }).join(""), 16); + if (value2 > maximumallowedcodepoint) + value2 = 65533; + return value2; + } else if (eof()) { + return 65533; + } else { + return code; + } + }; + const areAValidEscape = function(c1, c2) { + if (c1 !== 92) + return false; + if (newline(c2)) + return false; + return true; + }; + const startsWithAValidEscape = function() { + return areAValidEscape(code, next()); + }; + const wouldStartAnIdentifier = function(c1, c2, c3) { + if (c1 === 45) + return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3); + else if (namestartchar(c1)) + return true; + else if (c1 === 92) + return areAValidEscape(c1, c2); + else + return false; + }; + const startsWithAnIdentifier = function() { + return wouldStartAnIdentifier(code, next(1), next(2)); + }; + const wouldStartANumber = function(c1, c2, c3) { + if (c1 === 43 || c1 === 45) { + if (digit(c2)) + return true; + if (c2 === 46 && digit(c3)) + return true; + return false; + } else if (c1 === 46) { + if (digit(c2)) + return true; + return false; + } else if (digit(c1)) { + return true; + } else { + return false; + } + }; + const startsWithANumber = function() { + return wouldStartANumber(code, next(1), next(2)); + }; + const consumeAName = function() { + let result2 = ""; + while (consume()) { + if (namechar(code)) { + result2 += stringFromCode(code); + } else if (startsWithAValidEscape()) { + result2 += stringFromCode(consumeEscape()); + } else { + reconsume(); + return result2; + } + } + throw new Error("Internal parse error"); + }; + const consumeANumber = function() { + let repr = ""; + let type3 = "integer"; + if (next() === 43 || next() === 45) { + consume(); + repr += stringFromCode(code); + } + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + if (next(1) === 46 && digit(next(2))) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type3 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const c1 = next(1); + const c2 = next(2); + const c3 = next(3); + if ((c1 === 69 || c1 === 101) && digit(c2)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type3 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) { + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + consume(); + repr += stringFromCode(code); + type3 = "number"; + while (digit(next())) { + consume(); + repr += stringFromCode(code); + } + } + const value2 = convertAStringToANumber(repr); + return { type: type3, value: value2, repr }; + }; + const convertAStringToANumber = function(string) { + return +string; + }; + const consumeTheRemnantsOfABadURL = function() { + while (consume()) { + if (code === 41 || eof()) { + return; + } else if (startsWithAValidEscape()) { + consumeEscape(); + donothing(); + } else { + donothing(); + } + } + }; + let iterationCount = 0; + while (!eof(next())) { + tokens.push(consumeAToken()); + iterationCount++; + if (iterationCount > str.length * 2) + throw new Error("I'm infinite-looping!"); + } + return tokens; +} +function escapeIdent(string) { + string = "" + string; + let result2 = ""; + const firstcode = string.charCodeAt(0); + for (let i = 0; i < string.length; i++) { + const code = string.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45) + result2 += "\\" + code.toString(16) + " "; + else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result2 += string[i]; + else + result2 += "\\" + string[i]; + } + return result2; +} +function escapeHash(string) { + string = "" + string; + let result2 = ""; + for (let i = 0; i < string.length; i++) { + const code = string.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122)) + result2 += string[i]; + else + result2 += "\\" + code.toString(16) + " "; + } + return result2; +} +function escapeString(string) { + string = "" + string; + let result2 = ""; + for (let i = 0; i < string.length; i++) { + const code = string.charCodeAt(i); + if (code === 0) + throw new InvalidCharacterError("Invalid character: the input contains U+0000."); + if (between(code, 1, 31) || code === 127) + result2 += "\\" + code.toString(16) + " "; + else if (code === 34 || code === 92) + result2 += "\\" + string[i]; + else + result2 += string[i]; + } + return result2; +} +var between, maximumallowedcodepoint, InvalidCharacterError, CSSParserToken, BadStringToken, BadURLToken, WhitespaceToken, CDOToken, CDCToken, ColonToken, SemicolonToken, CommaToken, GroupingToken, OpenCurlyToken, CloseCurlyToken, OpenSquareToken, CloseSquareToken, OpenParenToken, CloseParenToken, IncludeMatchToken, DashMatchToken, PrefixMatchToken, SuffixMatchToken, SubstringMatchToken, ColumnToken, EOFToken, DelimToken, StringValuedToken, IdentToken, FunctionToken, AtKeywordToken, HashToken, StringToken, URLToken, NumberToken, PercentageToken, DimensionToken; +var init_cssTokenizer = __esm({ + "packages/isomorphic/cssTokenizer.ts"() { + "use strict"; + between = function(num, first, last) { + return num >= first && num <= last; + }; + maximumallowedcodepoint = 1114111; + InvalidCharacterError = class extends Error { + constructor(message) { + super(message); + this.name = "InvalidCharacterError"; + } + }; + CSSParserToken = class { + constructor() { + this.tokenType = ""; + } + toJSON() { + return { token: this.tokenType }; + } + toString() { + return this.tokenType; + } + toSource() { + return "" + this; + } + }; + BadStringToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADSTRING"; + } + }; + BadURLToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "BADURL"; + } + }; + WhitespaceToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "WHITESPACE"; + } + toString() { + return "WS"; + } + toSource() { + return " "; + } + }; + CDOToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "CDO"; + } + toSource() { + return ""; + } + }; + ColonToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ":"; + } + }; + SemicolonToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ";"; + } + }; + CommaToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = ","; + } + }; + GroupingToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + this.mirror = ""; + } + }; + OpenCurlyToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = "{"; + this.value = "{"; + this.mirror = "}"; + } + }; + CloseCurlyToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = "}"; + this.value = "}"; + this.mirror = "{"; + } + }; + OpenSquareToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = "["; + this.value = "["; + this.mirror = "]"; + } + }; + CloseSquareToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = "]"; + this.value = "]"; + this.mirror = "["; + } + }; + OpenParenToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = "("; + this.value = "("; + this.mirror = ")"; + } + }; + CloseParenToken = class extends GroupingToken { + constructor() { + super(); + this.tokenType = ")"; + this.value = ")"; + this.mirror = "("; + } + }; + IncludeMatchToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "~="; + } + }; + DashMatchToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "|="; + } + }; + PrefixMatchToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "^="; + } + }; + SuffixMatchToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "$="; + } + }; + SubstringMatchToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "*="; + } + }; + ColumnToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "||"; + } + }; + EOFToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.tokenType = "EOF"; + } + toSource() { + return ""; + } + }; + DelimToken = class extends CSSParserToken { + constructor(code) { + super(); + this.tokenType = "DELIM"; + this.value = ""; + this.value = stringFromCode(code); + } + toString() { + return "DELIM(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } + toSource() { + if (this.value === "\\") + return "\\\n"; + else + return this.value; + } + }; + StringValuedToken = class extends CSSParserToken { + constructor() { + super(...arguments); + this.value = ""; + } + ASCIIMatch(str) { + return this.value.toLowerCase() === str.toLowerCase(); + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + return json; + } + }; + IdentToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "IDENT"; + this.value = val; + } + toString() { + return "IDENT(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value); + } + }; + FunctionToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "FUNCTION"; + this.value = val; + this.mirror = ")"; + } + toString() { + return "FUNCTION(" + this.value + ")"; + } + toSource() { + return escapeIdent(this.value) + "("; + } + }; + AtKeywordToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "AT-KEYWORD"; + this.value = val; + } + toString() { + return "AT(" + this.value + ")"; + } + toSource() { + return "@" + escapeIdent(this.value); + } + }; + HashToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "HASH"; + this.value = val; + this.type = "unrestricted"; + } + toString() { + return "HASH(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + return json; + } + toSource() { + if (this.type === "id") + return "#" + escapeIdent(this.value); + else + return "#" + escapeHash(this.value); + } + }; + StringToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "STRING"; + this.value = val; + } + toString() { + return '"' + escapeString(this.value) + '"'; + } + }; + URLToken = class extends StringValuedToken { + constructor(val) { + super(); + this.tokenType = "URL"; + this.value = val; + } + toString() { + return "URL(" + this.value + ")"; + } + toSource() { + return 'url("' + escapeString(this.value) + '")'; + } + }; + NumberToken = class extends CSSParserToken { + constructor() { + super(); + this.tokenType = "NUMBER"; + this.type = "integer"; + this.repr = ""; + } + toString() { + if (this.type === "integer") + return "INT(" + this.value + ")"; + return "NUMBER(" + this.value + ")"; + } + toJSON() { + const json = super.toJSON(); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr; + } + }; + PercentageToken = class extends CSSParserToken { + constructor() { + super(); + this.tokenType = "PERCENTAGE"; + this.repr = ""; + } + toString() { + return "PERCENTAGE(" + this.value + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.repr = this.repr; + return json; + } + toSource() { + return this.repr + "%"; + } + }; + DimensionToken = class extends CSSParserToken { + constructor() { + super(); + this.tokenType = "DIMENSION"; + this.type = "integer"; + this.repr = ""; + this.unit = ""; + } + toString() { + return "DIM(" + this.value + "," + this.unit + ")"; + } + toJSON() { + const json = this.constructor.prototype.constructor.prototype.toJSON.call(this); + json.value = this.value; + json.type = this.type; + json.repr = this.repr; + json.unit = this.unit; + return json; + } + toSource() { + const source12 = this.repr; + let unit = escapeIdent(this.unit); + if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) { + unit = "\\65 " + unit.slice(1, unit.length); + } + return source12 + unit; + } + }; + } +}); + +// packages/isomorphic/cssParser.ts +function isInvalidSelectorError(error) { + return error instanceof InvalidSelectorError; +} +function parseCSS(selector, customNames) { + let tokens; + try { + tokens = tokenize(selector); + if (!(tokens[tokens.length - 1] instanceof EOFToken)) + tokens.push(new EOFToken()); + } catch (e) { + const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`; + const index = (e.stack || "").indexOf(e.message); + if (index !== -1) + e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length); + e.message = newMessage; + throw e; + } + const unsupportedToken = tokens.find((token) => { + return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings. + // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz } + // Or this way :xpath( {complex-xpath-goes-here("hello")} ) + token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings? + token instanceof URLToken || token instanceof PercentageToken; + }); + if (unsupportedToken) + throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + let pos = 0; + const names = /* @__PURE__ */ new Set(); + function unexpected() { + return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + } + function skipWhitespace() { + while (tokens[pos] instanceof WhitespaceToken) + pos++; + } + function isIdent(p = pos) { + return tokens[p] instanceof IdentToken; + } + function isString2(p = pos) { + return tokens[p] instanceof StringToken; + } + function isNumber(p = pos) { + return tokens[p] instanceof NumberToken; + } + function isComma(p = pos) { + return tokens[p] instanceof CommaToken; + } + function isOpenParen(p = pos) { + return tokens[p] instanceof OpenParenToken; + } + function isCloseParen(p = pos) { + return tokens[p] instanceof CloseParenToken; + } + function isFunction2(p = pos) { + return tokens[p] instanceof FunctionToken; + } + function isStar(p = pos) { + return tokens[p] instanceof DelimToken && tokens[p].value === "*"; + } + function isEOF(p = pos) { + return tokens[p] instanceof EOFToken; + } + function isClauseCombinator(p = pos) { + return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value); + } + function isSelectorClauseEnd(p = pos) { + return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken; + } + function consumeFunctionArguments() { + const result3 = [consumeArgument()]; + while (true) { + skipWhitespace(); + if (!isComma()) + break; + pos++; + result3.push(consumeArgument()); + } + return result3; + } + function consumeArgument() { + skipWhitespace(); + if (isNumber()) + return tokens[pos++].value; + if (isString2()) + return tokens[pos++].value; + return consumeComplexSelector(); + } + function consumeComplexSelector() { + const result3 = { simples: [] }; + skipWhitespace(); + if (isClauseCombinator()) { + result3.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" }); + } else { + result3.simples.push({ selector: consumeSimpleSelector(), combinator: "" }); + } + while (true) { + skipWhitespace(); + if (isClauseCombinator()) { + result3.simples[result3.simples.length - 1].combinator = tokens[pos++].value; + skipWhitespace(); + } else if (isSelectorClauseEnd()) { + break; + } + result3.simples.push({ combinator: "", selector: consumeSimpleSelector() }); + } + return result3; + } + function consumeSimpleSelector() { + let rawCSSString = ""; + const functions = []; + while (!isSelectorClauseEnd()) { + if (isIdent() || isStar()) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof HashToken) { + rawCSSString += tokens[pos++].toSource(); + } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") { + pos++; + if (isIdent()) + rawCSSString += "." + tokens[pos++].toSource(); + else + throw unexpected(); + } else if (tokens[pos] instanceof ColonToken) { + pos++; + if (isIdent()) { + if (!customNames.has(tokens[pos].value.toLowerCase())) { + rawCSSString += ":" + tokens[pos++].toSource(); + } else { + const name = tokens[pos++].value.toLowerCase(); + functions.push({ name, args: [] }); + names.add(name); + } + } else if (isFunction2()) { + const name = tokens[pos++].value.toLowerCase(); + if (!customNames.has(name)) { + rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`; + } else { + functions.push({ name, args: consumeFunctionArguments() }); + names.add(name); + } + skipWhitespace(); + if (!isCloseParen()) + throw unexpected(); + pos++; + } else { + throw unexpected(); + } + } else if (tokens[pos] instanceof OpenSquareToken) { + rawCSSString += "["; + pos++; + while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF()) + rawCSSString += tokens[pos++].toSource(); + if (!(tokens[pos] instanceof CloseSquareToken)) + throw unexpected(); + rawCSSString += "]"; + pos++; + } else { + throw unexpected(); + } + } + if (!rawCSSString && !functions.length) + throw unexpected(); + return { css: rawCSSString || void 0, functions }; + } + function consumeBuiltinFunctionArguments() { + let s = ""; + let balance = 1; + while (!isEOF()) { + if (isOpenParen() || isFunction2()) + balance++; + if (isCloseParen()) + balance--; + if (!balance) + break; + s += tokens[pos++].toSource(); + } + return s; + } + const result2 = consumeFunctionArguments(); + if (!isEOF()) + throw unexpected(); + if (result2.some((arg) => typeof arg !== "object" || !("simples" in arg))) + throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`); + return { selector: result2, names: Array.from(names) }; +} +function serializeSelector(args) { + return args.map((arg) => { + if (typeof arg === "string") + return `"${arg}"`; + if (typeof arg === "number") + return String(arg); + return arg.simples.map(({ selector, combinator }) => { + let s = selector.css || ""; + s = s + selector.functions.map((func) => `:${func.name}(${serializeSelector(func.args)})`).join(""); + if (combinator) + s += " " + combinator; + return s; + }).join(" "); + }).join(", "); +} +var InvalidSelectorError; +var init_cssParser = __esm({ + "packages/isomorphic/cssParser.ts"() { + "use strict"; + init_cssTokenizer(); + InvalidSelectorError = class extends Error { + }; + } +}); + +// packages/isomorphic/selectorParser.ts +function parseSelector(selector) { + const parsedStrings = parseSelectorString(selector); + const parts = []; + for (const part of parsedStrings.parts) { + if (part.name === "css" || part.name === "css:light") { + if (part.name === "css:light") + part.body = ":light(" + part.body + ")"; + const parsedCSS = parseCSS(part.body, customCSSNames); + parts.push({ + name: "css", + body: parsedCSS.selector, + source: part.body + }); + continue; + } + if (kNestedSelectorNames.has(part.name)) { + let innerSelector; + let distance; + try { + const unescaped = JSON.parse("[" + part.body + "]"); + if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string") + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + innerSelector = unescaped[0]; + if (unescaped.length === 2) { + if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name)) + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + distance = unescaped[1]; + } + } catch (e) { + throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body); + } + const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } }; + const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame"); + const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1; + if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1))) + nested.body.parsed.parts.splice(0, lastFrameIndex + 1); + parts.push(nested); + continue; + } + parts.push({ ...part, source: part.body }); + } + if (kNestedSelectorNames.has(parts[0].name)) + throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`); + return { + capture: parsedStrings.capture, + parts + }; +} +function splitSelectorByFrame(selectorText) { + const selector = parseSelector(selectorText); + const result2 = []; + let chunk = { + parts: [] + }; + let chunkStartIndex = 0; + for (let i = 0; i < selector.parts.length; ++i) { + const part = selector.parts[i]; + if (part.name === "internal:control" && part.body === "enter-frame") { + if (!chunk.parts.length) + throw new InvalidSelectorError("Selector cannot start with entering frame, select the iframe first"); + result2.push(chunk); + chunk = { parts: [] }; + chunkStartIndex = i + 1; + continue; + } + if (selector.capture === i) + chunk.capture = i - chunkStartIndex; + chunk.parts.push(part); + } + if (!chunk.parts.length) + throw new InvalidSelectorError(`Selector cannot end with entering frame, while parsing selector ${selectorText}`); + result2.push(chunk); + if (typeof selector.capture === "number" && typeof result2[result2.length - 1].capture !== "number") + throw new InvalidSelectorError(`Can not capture the selector before diving into the frame. Only use * after the last frame has been selected`); + return result2; +} +function selectorPartsEqual(list1, list2) { + return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 }); +} +function stringifySelector(selector, forceEngineName) { + if (typeof selector === "string") + return selector; + return selector.parts.map((p, i) => { + let includeEngine = true; + if (!forceEngineName && i !== selector.capture) { + if (p.name === "css") + includeEngine = false; + else if (p.name === "xpath" && (p.source.startsWith("//") || p.source.startsWith(".."))) + includeEngine = false; + } + const prefix = includeEngine ? p.name + "=" : ""; + return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`; + }).join(" >> "); +} +function visitAllSelectorParts(selector, visitor) { + const visit = (selector2, nested) => { + for (const part of selector2.parts) { + visitor(part, nested); + if (kNestedSelectorNames.has(part.name)) + visit(part.body.parsed, true); + } + }; + visit(selector, false); +} +function parseSelectorString(selector) { + let index = 0; + let quote5; + let start3 = 0; + const result2 = { parts: [] }; + const append = () => { + const part = selector.substring(start3, index).trim(); + const eqIndex = part.indexOf("="); + let name; + let body; + if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) { + name = part.substring(0, eqIndex).trim(); + body = part.substring(eqIndex + 1); + } else if (part.length > 1 && part[0] === '"' && part[part.length - 1] === '"') { + name = "text"; + body = part; + } else if (part.length > 1 && part[0] === "'" && part[part.length - 1] === "'") { + name = "text"; + body = part; + } else if (/^\(*\/\//.test(part) || part.startsWith("..")) { + name = "xpath"; + body = part; + } else { + name = "css"; + body = part; + } + let capture = false; + if (name[0] === "*") { + capture = true; + name = name.substring(1); + } + result2.parts.push({ name, body }); + if (capture) { + if (result2.capture !== void 0) + throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`); + result2.capture = result2.parts.length - 1; + } + }; + if (!selector.includes(">>")) { + index = selector.length; + append(); + return result2; + } + const shouldIgnoreTextSelectorQuote = () => { + const prefix = selector.substring(start3, index); + const match = prefix.match(/^\s*text\s*=(.*)$/); + return !!match && !!match[1]; + }; + while (index < selector.length) { + const c = selector[index]; + if (c === "\\" && index + 1 < selector.length) { + index += 2; + } else if (c === quote5) { + quote5 = void 0; + index++; + } else if (!quote5 && (c === '"' || c === "'" || c === "`") && !shouldIgnoreTextSelectorQuote()) { + quote5 = c; + index++; + } else if (!quote5 && c === ">" && selector[index + 1] === ">") { + append(); + index += 2; + start3 = index; + } else { + index++; + } + } + append(); + return result2; +} +function parseAttributeSelector(selector, allowUnquotedStrings) { + let wp = 0; + let EOL = selector.length === 0; + const next = () => selector[wp] || ""; + const eat1 = () => { + const result3 = next(); + ++wp; + EOL = wp >= selector.length; + return result3; + }; + const syntaxError = (stage) => { + if (EOL) + throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \`${selector}\``); + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : "")); + }; + function skipSpaces() { + while (!EOL && /\s/.test(next())) + eat1(); + } + function isCSSNameChar(char) { + return char >= "\x80" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-"; + } + function readIdentifier() { + let result3 = ""; + skipSpaces(); + while (!EOL && isCSSNameChar(next())) + result3 += eat1(); + return result3; + } + function readQuotedString(quote5) { + let result3 = eat1(); + if (result3 !== quote5) + syntaxError("parsing quoted string"); + while (!EOL && next() !== quote5) { + if (next() === "\\") + eat1(); + result3 += eat1(); + } + if (next() !== quote5) + syntaxError("parsing quoted string"); + result3 += eat1(); + return result3; + } + function readRegularExpression() { + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let source12 = ""; + let inClass = false; + while (!EOL) { + if (next() === "\\") { + source12 += eat1(); + if (EOL) + syntaxError("parsing regular expression"); + } else if (inClass && next() === "]") { + inClass = false; + } else if (!inClass && next() === "[") { + inClass = true; + } else if (!inClass && next() === "/") { + break; + } + source12 += eat1(); + } + if (eat1() !== "/") + syntaxError("parsing regular expression"); + let flags = ""; + while (!EOL && next().match(/[dgimsuvy]/)) + flags += eat1(); + try { + return new RegExp(source12, flags); + } catch (e) { + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\`: ${e.message}`); + } + } + function readAttributeToken() { + let token = ""; + skipSpaces(); + if (next() === `'` || next() === `"`) + token = readQuotedString(next()).slice(1, -1); + else + token = readIdentifier(); + if (!token) + syntaxError("parsing property path"); + return token; + } + function readOperator() { + skipSpaces(); + let op = ""; + if (!EOL) + op += eat1(); + if (!EOL && op !== "=") + op += eat1(); + if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op)) + syntaxError("parsing operator"); + return op; + } + function readAttribute() { + eat1(); + const jsonPath = []; + jsonPath.push(readAttributeToken()); + skipSpaces(); + while (next() === ".") { + eat1(); + jsonPath.push(readAttributeToken()); + skipSpaces(); + } + if (next() === "]") { + eat1(); + return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false }; + } + const operator = readOperator(); + let value2 = void 0; + let caseSensitive = true; + skipSpaces(); + if (next() === "/") { + if (operator !== "=") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with regular expression`); + value2 = readRegularExpression(); + } else if (next() === `'` || next() === `"`) { + value2 = readQuotedString(next()).slice(1, -1); + skipSpaces(); + if (next() === "i" || next() === "I") { + caseSensitive = false; + eat1(); + } else if (next() === "s" || next() === "S") { + caseSensitive = true; + eat1(); + } + } else { + value2 = ""; + while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === ".")) + value2 += eat1(); + if (value2 === "true") { + value2 = true; + } else if (value2 === "false") { + value2 = false; + } else { + if (!allowUnquotedStrings) { + value2 = +value2; + if (Number.isNaN(value2)) + syntaxError("parsing attribute value"); + } + } + } + skipSpaces(); + if (next() !== "]") + syntaxError("parsing attribute value"); + eat1(); + if (operator !== "=" && typeof value2 !== "string") + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - cannot use ${operator} in attribute with non-string matching value - ${value2}`); + return { name: jsonPath.join("."), jsonPath, op: operator, value: value2, caseSensitive }; + } + const result2 = { + name: "", + attributes: [] + }; + result2.name = readIdentifier(); + skipSpaces(); + while (next() === "[") { + result2.attributes.push(readAttribute()); + skipSpaces(); + } + if (!EOL) + syntaxError(void 0); + if (!result2.name && !result2.attributes.length) + throw new InvalidSelectorError(`Error while parsing selector \`${selector}\` - selector cannot be empty`); + return result2; +} +var kNestedSelectorNames, kNestedSelectorNamesWithDistance, customCSSNames; +var init_selectorParser = __esm({ + "packages/isomorphic/selectorParser.ts"() { + "use strict"; + init_cssParser(); + init_cssParser(); + kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]); + kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]); + customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]); + } +}); + +// packages/isomorphic/stringUtils.ts +function escapeWithQuotes(text2, char = "'") { + const stringified = JSON.stringify(text2); + const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\"/g, '"'); + if (char === "'") + return char + escapedText.replace(/[']/g, "\\'") + char; + if (char === '"') + return char + escapedText.replace(/["]/g, '\\"') + char; + if (char === "`") + return char + escapedText.replace(/[`]/g, "\\`") + char; + throw new Error("Invalid escape char"); +} +function escapeTemplateString(text2) { + return text2.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${"); +} +function isString(obj) { + return typeof obj === "string" || obj instanceof String; +} +function toTitleCase(name) { + return name.charAt(0).toUpperCase() + name.substring(1); +} +function toSnakeCase(name) { + return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase(); +} +function formatObject(value2, indent = " ", mode = "multiline") { + if (typeof value2 === "string") + return escapeWithQuotes(value2, "'"); + if (Array.isArray(value2)) + return `[${value2.map((o) => formatObject(o)).join(", ")}]`; + if (typeof value2 === "object") { + const keys = Object.keys(value2).filter((key) => key !== "timeout" && value2[key] !== void 0).sort(); + if (!keys.length) + return "{}"; + const tokens = []; + for (const key of keys) + tokens.push(`${key}: ${formatObject(value2[key])}`); + if (mode === "multiline") + return `{ +${tokens.map((t) => indent + t).join(`, +`)} +}`; + return `{ ${tokens.join(", ")} }`; + } + return String(value2); +} +function formatObjectOrVoid(value2, indent = " ") { + const result2 = formatObject(value2, indent); + return result2 === "{}" ? "" : result2; +} +function quoteCSSAttributeValue(text2) { + return `"${text2.replace(/["\\]/g, (char) => "\\" + char)}"`; +} +function cacheNormalizedWhitespaces() { + normalizedWhitespaceCache = /* @__PURE__ */ new Map(); +} +function normalizeWhiteSpace(text2) { + let result2 = normalizedWhitespaceCache?.get(text2); + if (result2 === void 0) { + result2 = text2.replace(/[\u200b\u00ad]/g, "").trim().replace(/\s+/g, " "); + normalizedWhitespaceCache?.set(text2, result2); + } + return result2; +} +function normalizeEscapedRegexQuotes(source12) { + return source12.replace(/(^|[^\\])(\\\\)*\\(['"`])/g, "$1$2$3"); +} +function escapeRegexForSelector(re2) { + if (re2.unicode || re2.unicodeSets) + return String(re2); + return String(re2).replace(/(^|[^\\])(\\\\)*(["'`])/g, "$1$2\\$3").replace(/>>/g, "\\>\\>"); +} +function escapeForTextSelector(text2, exact) { + if (typeof text2 !== "string") + return escapeRegexForSelector(text2); + return `${JSON.stringify(text2)}${exact ? "s" : "i"}`; +} +function escapeForAttributeSelector(value2, exact) { + if (typeof value2 !== "string") + return escapeRegexForSelector(value2); + return `"${value2.replace(/\\/g, "\\\\").replace(/["]/g, '\\"')}"${exact ? "s" : "i"}`; +} +function trimString(input, cap, suffix = "") { + if (input.length <= cap) + return input; + const chars = [...input]; + if (chars.length > cap) + return chars.slice(0, cap - suffix.length).join("") + suffix; + return chars.join(""); +} +function trimStringWithEllipsis(input, cap) { + return trimString(input, cap, "\u2026"); +} +function truncateDataUrl(url3) { + if (!url3.startsWith("data:")) + return url3; + const comma = url3.indexOf(","); + if (comma === -1) + return url3; + return url3.slice(0, comma + 1) + "\u2026"; +} +function escapeRegExp(s) { + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +} +function escapeHTMLAttribute(s) { + return s.replace(/[&<>"']/ug, (char) => escaped[char]); +} +function escapeHTML(s) { + return s.replace(/[&<]/ug, (char) => escaped[char]); +} +function longestCommonSubstring(s1, s2) { + const n = s1.length; + const m = s2.length; + let maxLen = 0; + let endingIndex = 0; + const dp = Array(n + 1).fill(null).map(() => Array(m + 1).fill(0)); + for (let i = 1; i <= n; i++) { + for (let j = 1; j <= m; j++) { + if (s1[i - 1] === s2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + if (dp[i][j] > maxLen) { + maxLen = dp[i][j]; + endingIndex = i; + } + } + } + } + return s1.slice(endingIndex - maxLen, endingIndex); +} +function parseRegex(regex) { + if (regex[0] !== "/") + throw new Error(`Invalid regex, must start with '/': ${regex}`); + const lastSlash = regex.lastIndexOf("/"); + if (lastSlash <= 0) + throw new Error(`Invalid regex, must end with '/' followed by optional flags: ${regex}`); + const source12 = regex.slice(1, lastSlash); + const flags = regex.slice(lastSlash + 1); + return new RegExp(source12, flags); +} +function tomlBasicString(value2) { + return JSON.stringify(value2); +} +function tomlArray(values) { + return `[${values.map((value2) => tomlBasicString(value2)).join(", ")}]`; +} +function tomlMultilineBasicString(value2) { + const escaped2 = value2.replace(/\\/g, "\\\\").replace(/"""/g, '\\"\\"\\"'); + return `""" +${escaped2} +"""`; +} +function stripAnsiEscapes(str) { + return str.replace(ansiRegex, ""); +} +var normalizedWhitespaceCache, escaped, ansiRegex; +var init_stringUtils = __esm({ + "packages/isomorphic/stringUtils.ts"() { + "use strict"; + escaped = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }; + ansiRegex = new RegExp("([\\u001B\\u009B][[\\]()#?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{0,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~])))", "g"); + } +}); + +// packages/isomorphic/locatorGenerators.ts +function asLocatorDescription(lang, selector) { + try { + const parsed = parseSelector(selector); + const customDescription = parseCustomDescription(parsed); + if (customDescription) + return customDescription; + return innerAsLocators(new generators[lang](), parsed, false, 1)[0]; + } catch (e) { + return selector; + } +} +function locatorCustomDescription(selector) { + try { + const parsed = parseSelector(selector); + return parseCustomDescription(parsed); + } catch (e) { + return void 0; + } +} +function parseCustomDescription(parsed) { + const lastPart = parsed.parts[parsed.parts.length - 1]; + if (lastPart?.name === "internal:describe") { + const description = JSON.parse(lastPart.body); + if (typeof description === "string") + return description; + } + return void 0; +} +function asLocator(lang, selector, isFrameLocator = false) { + return asLocators(lang, selector, isFrameLocator, 1)[0]; +} +function asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) { + try { + return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize); + } catch (e) { + return [selector]; + } +} +function innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) { + const parts = [...parsed.parts]; + const tokens = []; + let nextBase = isFrameLocator ? "frame-locator" : "page"; + for (let index = 0; index < parts.length; index++) { + const part = parts[index]; + const base = nextBase; + nextBase = "locator"; + if (part.name === "internal:describe") + continue; + if (part.name === "nth") { + if (part.body === "0") + tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]); + else if (part.body === "-1") + tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]); + else + tokens.push([factory.generateLocator(base, "nth", part.body)]); + continue; + } + if (part.name === "visible") { + tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]); + continue; + } + if (part.name === "internal:text") { + const { exact, text: text2 } = detectExact(part.body); + tokens.push([factory.generateLocator(base, "text", text2, { exact })]); + continue; + } + if (part.name === "internal:has-text") { + const { exact, text: text2 } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base, "has-text", text2, { exact })]); + continue; + } + } + if (part.name === "internal:has-not-text") { + const { exact, text: text2 } = detectExact(part.body); + if (!exact) { + tokens.push([factory.generateLocator(base, "has-not-text", text2, { exact })]); + continue; + } + } + if (part.name === "internal:has") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner))); + continue; + } + if (part.name === "internal:has-not") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner))); + continue; + } + if (part.name === "internal:and") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner))); + continue; + } + if (part.name === "internal:or") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner))); + continue; + } + if (part.name === "internal:chain") { + const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize); + tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner))); + continue; + } + if (part.name === "internal:label") { + const { exact, text: text2 } = detectExact(part.body); + tokens.push([factory.generateLocator(base, "label", text2, { exact })]); + continue; + } + if (part.name === "internal:role") { + const attrSelector = parseAttributeSelector(part.body, true); + const options = { attrs: [] }; + for (const attr of attrSelector.attributes) { + if (attr.name === "name") { + if (options.exact !== void 0 && options.exact !== attr.caseSensitive) + throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`); + options.exact = attr.caseSensitive; + options.name = attr.value; + } else if (attr.name === "description") { + if (options.exact !== void 0 && options.exact !== attr.caseSensitive) + throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`); + options.exact = attr.caseSensitive; + options.description = attr.value; + } else { + if (attr.name === "level" && typeof attr.value === "string") + attr.value = +attr.value; + options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value }); + } + } + tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]); + continue; + } + if (part.name === "internal:testid") { + const attrSelector = parseAttributeSelector(part.body, true); + const { value: value2 } = attrSelector.attributes[0]; + tokens.push([factory.generateLocator(base, "test-id", value2)]); + continue; + } + if (part.name === "internal:attr") { + const attrSelector = parseAttributeSelector(part.body, true); + const { name, value: value2, caseSensitive } = attrSelector.attributes[0]; + const text2 = value2; + const exact = !!caseSensitive; + if (name === "placeholder") { + tokens.push([factory.generateLocator(base, "placeholder", text2, { exact })]); + continue; + } + if (name === "alt") { + tokens.push([factory.generateLocator(base, "alt", text2, { exact })]); + continue; + } + if (name === "title") { + tokens.push([factory.generateLocator(base, "title", text2, { exact })]); + continue; + } + } + if (part.name === "internal:control" && part.body === "enter-frame") { + const lastTokens = tokens[tokens.length - 1]; + const lastPart = parts[index - 1]; + const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")])); + if (["xpath", "css"].includes(lastPart.name)) { + transformed.push( + factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })), + factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true)) + ); + } + lastTokens.splice(0, lastTokens.length, ...transformed); + nextBase = "frame-locator"; + continue; + } + const nextPart = parts[index + 1]; + const selectorPart = stringifySelector({ parts: [part] }); + const locatorPart = factory.generateLocator(base, "default", selectorPart); + if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) { + const { exact, text: text2 } = detectExact(nextPart.body); + if (!exact) { + const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text2, { exact }); + const options = {}; + if (nextPart.name === "internal:has-text") + options.hasText = text2; + else + options.hasNotText = text2; + const combinedPart = factory.generateLocator(base, "default", selectorPart, options); + tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]); + index++; + continue; + } + } + let locatorPartWithEngine; + if (["xpath", "css"].includes(part.name)) { + const selectorPart2 = stringifySelector( + { parts: [part] }, + /* forceEngineName */ + true + ); + locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2); + } + tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean)); + } + return combineTokens(factory, tokens, maxOutputSize); +} +function combineTokens(factory, tokens, maxOutputSize) { + const currentTokens = tokens.map(() => ""); + const result2 = []; + const visit = (index) => { + if (index === tokens.length) { + result2.push(factory.chainLocators(currentTokens)); + return result2.length < maxOutputSize; + } + for (const taken of tokens[index]) { + currentTokens[index] = taken; + if (!visit(index + 1)) + return false; + } + return true; + }; + visit(0); + return result2; +} +function detectExact(text2) { + let exact = false; + const match = text2.match(/^\/(.*)\/([igm]*)$/); + if (match) + return { text: new RegExp(match[1], match[2]) }; + if (text2.endsWith('"')) { + text2 = JSON.parse(text2); + exact = true; + } else if (text2.endsWith('"s')) { + text2 = JSON.parse(text2.substring(0, text2.length - 1)); + exact = true; + } else if (text2.endsWith('"i')) { + text2 = JSON.parse(text2.substring(0, text2.length - 1)); + exact = false; + } + return { exact, text: text2 }; +} +function isRegExp(obj) { + return obj instanceof RegExp; +} +var JavaScriptLocatorFactory, PythonLocatorFactory, JavaLocatorFactory, CSharpLocatorFactory, JsonlLocatorFactory, generators; +var init_locatorGenerators = __esm({ + "packages/isomorphic/locatorGenerators.ts"() { + "use strict"; + init_selectorParser(); + init_stringUtils(); + JavaScriptLocatorFactory = class { + constructor(preferredQuote) { + this.preferredQuote = preferredQuote; + } + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter({ visible: ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp(options.name)) + attrs.push(`name: ${this.regexToSourceString(options.name)}`); + else if (typeof options.name === "string") + attrs.push(`name: ${this.quote(options.name)}`); + if (isRegExp(options.description)) + attrs.push(`description: ${this.regexToSourceString(options.description)}`); + else if (typeof options.description === "string") + attrs.push(`description: ${this.quote(options.description)}`); + if (options.exact && (typeof options.name === "string" || typeof options.description === "string")) + attrs.push(`exact: true`); + for (const { name, value: value2 } of options.attrs) + attrs.push(`${name}: ${typeof value2 === "string" ? this.quote(value2) : value2}`); + const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : ""; + return `getByRole(${this.quote(body)}${attrString})`; + case "has-text": + return `filter({ hasText: ${this.toHasText(body)} })`; + case "has-not-text": + return `filter({ hasNotText: ${this.toHasText(body)} })`; + case "has": + return `filter({ has: ${body} })`; + case "hasNot": + return `filter({ hasNot: ${body} })`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("getByText", body, !!options.exact); + case "alt": + return this.toCallWithExact("getByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("getByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact("getByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact("getByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToSourceString(re2) { + return normalizeEscapedRegexQuotes(String(re2)); + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToSourceString(body)})`; + return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToSourceString(body); + return this.quote(body); + } + toTestIdValue(value2) { + if (isRegExp(value2)) + return this.regexToSourceString(value2); + return this.quote(value2); + } + quote(text2) { + return escapeWithQuotes(text2, this.preferredQuote ?? "'"); + } + }; + PythonLocatorFactory = class { + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frame_locator(${this.quote(body)})`; + case "frame": + return `content_frame`; + case "nth": + return `nth(${body})`; + case "first": + return `first`; + case "last": + return `last`; + case "visible": + return `filter(visible=${body === "true" ? "True" : "False"})`; + case "role": + const attrs = []; + if (isRegExp(options.name)) + attrs.push(`name=${this.regexToString(options.name)}`); + else if (typeof options.name === "string") + attrs.push(`name=${this.quote(options.name)}`); + if (isRegExp(options.description)) + attrs.push(`description=${this.regexToString(options.description)}`); + else if (typeof options.description === "string") + attrs.push(`description=${this.quote(options.description)}`); + if (options.exact && (typeof options.name === "string" || typeof options.description === "string")) + attrs.push(`exact=True`); + for (const { name, value: value2 } of options.attrs) { + let valueString = typeof value2 === "string" ? this.quote(value2) : value2; + if (typeof value2 === "boolean") + valueString = value2 ? "True" : "False"; + attrs.push(`${toSnakeCase(name)}=${valueString}`); + } + const attrString = attrs.length ? `, ${attrs.join(", ")}` : ""; + return `get_by_role(${this.quote(body)}${attrString})`; + case "has-text": + return `filter(has_text=${this.toHasText(body)})`; + case "has-not-text": + return `filter(has_not_text=${this.toHasText(body)})`; + case "has": + return `filter(has=${body})`; + case "hasNot": + return `filter(has_not=${body})`; + case "and": + return `and_(${body})`; + case "or": + return `or_(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `get_by_test_id(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("get_by_text", body, !!options.exact); + case "alt": + return this.toCallWithExact("get_by_alt_text", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("get_by_placeholder", body, !!options.exact); + case "label": + return this.toCallWithExact("get_by_label", body, !!options.exact); + case "title": + return this.toCallWithExact("get_by_title", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : ""; + return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\//, "/").replace(/"/g, '\\"')}"${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, exact=True)`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToString(body); + return `${this.quote(body)}`; + } + toTestIdValue(value2) { + if (isRegExp(value2)) + return this.regexToString(value2); + return this.quote(value2); + } + quote(text2) { + return escapeWithQuotes(text2, '"'); + } + }; + JavaLocatorFactory = class { + generateLocator(base, kind, body, options = {}) { + let clazz; + switch (base) { + case "page": + clazz = "Page"; + break; + case "frame-locator": + clazz = "FrameLocator"; + break; + case "locator": + clazz = "Locator"; + break; + } + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`; + if (options.hasNotText !== void 0) + return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`; + return `locator(${this.quote(body)})`; + case "frame-locator": + return `frameLocator(${this.quote(body)})`; + case "frame": + return `contentFrame()`; + case "nth": + return `nth(${body})`; + case "first": + return `first()`; + case "last": + return `last()`; + case "visible": + return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`; + case "role": + const attrs = []; + if (isRegExp(options.name)) + attrs.push(`.setName(${this.regexToString(options.name)})`); + else if (typeof options.name === "string") + attrs.push(`.setName(${this.quote(options.name)})`); + if (isRegExp(options.description)) + attrs.push(`.setDescription(${this.regexToString(options.description)})`); + else if (typeof options.description === "string") + attrs.push(`.setDescription(${this.quote(options.description)})`); + if (options.exact && (typeof options.name === "string" || typeof options.description === "string")) + attrs.push(`.setExact(true)`); + for (const { name, value: value2 } of options.attrs) + attrs.push(`.set${toTitleCase(name)}(${typeof value2 === "string" ? this.quote(value2) : value2})`); + const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : ""; + return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`; + case "has-text": + return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`; + case "has-not-text": + return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`; + case "has": + return `filter(new ${clazz}.FilterOptions().setHas(${body}))`; + case "hasNot": + return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`; + case "and": + return `and(${body})`; + case "or": + return `or(${body})`; + case "chain": + return `locator(${body})`; + case "test-id": + return `getByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact(clazz, "getByText", body, !!options.exact); + case "alt": + return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : ""; + return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(clazz, method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return this.regexToString(body); + return this.quote(body); + } + toTestIdValue(value2) { + if (isRegExp(value2)) + return this.regexToString(value2); + return this.quote(value2); + } + quote(text2) { + return escapeWithQuotes(text2, '"'); + } + }; + CSharpLocatorFactory = class { + generateLocator(base, kind, body, options = {}) { + switch (kind) { + case "default": + if (options.hasText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`; + if (options.hasNotText !== void 0) + return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`; + return `Locator(${this.quote(body)})`; + case "frame-locator": + return `FrameLocator(${this.quote(body)})`; + case "frame": + return `ContentFrame`; + case "nth": + return `Nth(${body})`; + case "first": + return `First`; + case "last": + return `Last`; + case "visible": + return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`; + case "role": + const attrs = []; + if (isRegExp(options.name)) + attrs.push(`NameRegex = ${this.regexToString(options.name)}`); + else if (typeof options.name === "string") + attrs.push(`Name = ${this.quote(options.name)}`); + if (isRegExp(options.description)) + attrs.push(`DescriptionRegex = ${this.regexToString(options.description)}`); + else if (typeof options.description === "string") + attrs.push(`Description = ${this.quote(options.description)}`); + if (options.exact && (typeof options.name === "string" || typeof options.description === "string")) + attrs.push(`Exact = true`); + for (const { name, value: value2 } of options.attrs) + attrs.push(`${toTitleCase(name)} = ${typeof value2 === "string" ? this.quote(value2) : value2}`); + const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : ""; + return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`; + case "has-text": + return `Filter(new() { ${this.toHasText(body)} })`; + case "has-not-text": + return `Filter(new() { ${this.toHasNotText(body)} })`; + case "has": + return `Filter(new() { Has = ${body} })`; + case "hasNot": + return `Filter(new() { HasNot = ${body} })`; + case "and": + return `And(${body})`; + case "or": + return `Or(${body})`; + case "chain": + return `Locator(${body})`; + case "test-id": + return `GetByTestId(${this.toTestIdValue(body)})`; + case "text": + return this.toCallWithExact("GetByText", body, !!options.exact); + case "alt": + return this.toCallWithExact("GetByAltText", body, !!options.exact); + case "placeholder": + return this.toCallWithExact("GetByPlaceholder", body, !!options.exact); + case "label": + return this.toCallWithExact("GetByLabel", body, !!options.exact); + case "title": + return this.toCallWithExact("GetByTitle", body, !!options.exact); + default: + throw new Error("Unknown selector kind " + kind); + } + } + chainLocators(locators) { + return locators.join("."); + } + regexToString(body) { + const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : ""; + return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`; + } + toCallWithExact(method, body, exact) { + if (isRegExp(body)) + return `${method}(${this.regexToString(body)})`; + if (exact) + return `${method}(${this.quote(body)}, new() { Exact = true })`; + return `${method}(${this.quote(body)})`; + } + toHasText(body) { + if (isRegExp(body)) + return `HasTextRegex = ${this.regexToString(body)}`; + return `HasText = ${this.quote(body)}`; + } + toTestIdValue(value2) { + if (isRegExp(value2)) + return this.regexToString(value2); + return this.quote(value2); + } + toHasNotText(body) { + if (isRegExp(body)) + return `HasNotTextRegex = ${this.regexToString(body)}`; + return `HasNotText = ${this.quote(body)}`; + } + quote(text2) { + return escapeWithQuotes(text2, '"'); + } + }; + JsonlLocatorFactory = class { + generateLocator(base, kind, body, options = {}) { + return JSON.stringify({ + kind, + body, + options + }); + } + chainLocators(locators) { + const objects = locators.map((l) => JSON.parse(l)); + for (let i = 0; i < objects.length - 1; ++i) { + let tail = objects[i]; + while (tail.next) + tail = tail.next; + tail.next = objects[i + 1]; + } + return JSON.stringify(objects[0]); + } + }; + generators = { + javascript: JavaScriptLocatorFactory, + python: PythonLocatorFactory, + java: JavaLocatorFactory, + csharp: CSharpLocatorFactory, + jsonl: JsonlLocatorFactory + }; + } +}); + +// packages/isomorphic/manualPromise.ts +function signalToPromise(signal) { + if (signal.aborted) + return { promise: Promise.resolve(), dispose: () => { + } }; + let dispose; + const promise = new Promise((resolve) => { + const onAbort = () => resolve(); + signal.addEventListener("abort", onAbort, { once: true }); + dispose = () => signal.removeEventListener("abort", onAbort); + }); + return { promise, dispose }; +} +function cloneError(error, frames) { + const clone = new Error(); + clone.name = error.name; + clone.message = error.message; + clone.stack = [error.name + ":" + error.message, ...frames].join("\n"); + return clone; +} +var ManualPromise, LongStandingScope; +var init_manualPromise = __esm({ + "packages/isomorphic/manualPromise.ts"() { + "use strict"; + ManualPromise = class extends Promise { + constructor() { + let resolve; + let reject; + super((f, r) => { + resolve = f; + reject = r; + }); + this._isDone = false; + this._resolve = resolve; + this._reject = reject; + } + isDone() { + return this._isDone; + } + resolve(t) { + this._isDone = true; + this._resolve(t); + } + reject(e) { + this._isDone = true; + this._reject(e); + } + static get [Symbol.species]() { + return Promise; + } + get [Symbol.toStringTag]() { + return "ManualPromise"; + } + }; + LongStandingScope = class { + constructor() { + this._terminatePromises = /* @__PURE__ */ new Map(); + this._isClosed = false; + } + reject(error) { + this._isClosed = true; + this._terminateError = error; + for (const p of this._terminatePromises.keys()) + p.resolve(error); + } + close(error) { + this._isClosed = true; + this._closeError = error; + for (const [p, frames] of this._terminatePromises) + p.resolve(cloneError(error, frames)); + } + isClosed() { + return this._isClosed; + } + static async raceMultiple(scopes, promise) { + return Promise.race(scopes.map((s) => s.race(promise))); + } + async race(promise) { + return this._race(Array.isArray(promise) ? promise : [promise], false); + } + async safeRace(promise, defaultValue) { + return this._race([promise], true, defaultValue); + } + async _race(promises2, safe, defaultValue) { + const terminatePromise = new ManualPromise(); + const frames = (new Error().stack || "").split("\n"); + if (this._terminateError) + terminatePromise.resolve(this._terminateError); + if (this._closeError) + terminatePromise.resolve(cloneError(this._closeError, frames)); + this._terminatePromises.set(terminatePromise, frames); + try { + return await Promise.race([ + terminatePromise.then((e) => safe ? defaultValue : Promise.reject(e)), + ...promises2 + ]); + } finally { + this._terminatePromises.delete(terminatePromise); + } + } + }; + } +}); + +// packages/isomorphic/mimeType.ts +function isJsonMimeType(mimeType) { + return !!mimeType.match(/^(application\/json|application\/.*?\+json|text\/(x-)?json)(;\s*charset=.*)?$/); +} +function isXmlMimeType(mimeType) { + return !!mimeType.match(/^(application\/xml|application\/.*?\+xml|text\/xml)(;\s*charset=.*)?$/); +} +function isTextualMimeType(mimeType) { + return !!mimeType.match(/^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$/); +} +function getMimeTypeForPath(path66) { + const dotIndex = path66.lastIndexOf("."); + if (dotIndex === -1) + return null; + const extension = path66.substring(dotIndex + 1); + return types.get(extension) || null; +} +function getExtensionForMimeType(contentType) { + const subtype = (contentType ?? "").split(";")[0].split("/")[1]?.trim().toLowerCase() ?? ""; + if (!subtype) + return "bin"; + const tail = subtype.includes("+") ? subtype.split("+").pop() : subtype; + if (tail === "plain") + return "txt"; + if (tail === "javascript" || tail === "ecmascript") + return "js"; + if (tail === "jpeg") + return "jpg"; + return tail.replace(/[^a-z0-9]/g, "") || "bin"; +} +var types; +var init_mimeType = __esm({ + "packages/isomorphic/mimeType.ts"() { + "use strict"; + types = /* @__PURE__ */ new Map([ + ["ez", "application/andrew-inset"], + ["aw", "application/applixware"], + ["atom", "application/atom+xml"], + ["atomcat", "application/atomcat+xml"], + ["atomdeleted", "application/atomdeleted+xml"], + ["atomsvc", "application/atomsvc+xml"], + ["dwd", "application/atsc-dwd+xml"], + ["held", "application/atsc-held+xml"], + ["rsat", "application/atsc-rsat+xml"], + ["bdoc", "application/bdoc"], + ["xcs", "application/calendar+xml"], + ["ccxml", "application/ccxml+xml"], + ["cdfx", "application/cdfx+xml"], + ["cdmia", "application/cdmi-capability"], + ["cdmic", "application/cdmi-container"], + ["cdmid", "application/cdmi-domain"], + ["cdmio", "application/cdmi-object"], + ["cdmiq", "application/cdmi-queue"], + ["cu", "application/cu-seeme"], + ["mpd", "application/dash+xml"], + ["davmount", "application/davmount+xml"], + ["dbk", "application/docbook+xml"], + ["dssc", "application/dssc+der"], + ["xdssc", "application/dssc+xml"], + ["ecma", "application/ecmascript"], + ["es", "application/ecmascript"], + ["emma", "application/emma+xml"], + ["emotionml", "application/emotionml+xml"], + ["epub", "application/epub+zip"], + ["exi", "application/exi"], + ["exp", "application/express"], + ["fdt", "application/fdt+xml"], + ["pfr", "application/font-tdpfr"], + ["geojson", "application/geo+json"], + ["gml", "application/gml+xml"], + ["gpx", "application/gpx+xml"], + ["gxf", "application/gxf"], + ["gz", "application/gzip"], + ["hjson", "application/hjson"], + ["stk", "application/hyperstudio"], + ["ink", "application/inkml+xml"], + ["inkml", "application/inkml+xml"], + ["ipfix", "application/ipfix"], + ["its", "application/its+xml"], + ["ear", "application/java-archive"], + ["jar", "application/java-archive"], + ["war", "application/java-archive"], + ["ser", "application/java-serialized-object"], + ["class", "application/java-vm"], + ["js", "application/javascript"], + ["mjs", "application/javascript"], + ["json", "application/json"], + ["map", "application/json"], + ["json5", "application/json5"], + ["jsonml", "application/jsonml+json"], + ["jsonld", "application/ld+json"], + ["lgr", "application/lgr+xml"], + ["lostxml", "application/lost+xml"], + ["hqx", "application/mac-binhex40"], + ["cpt", "application/mac-compactpro"], + ["mads", "application/mads+xml"], + ["webmanifest", "application/manifest+json"], + ["mrc", "application/marc"], + ["mrcx", "application/marcxml+xml"], + ["ma", "application/mathematica"], + ["mb", "application/mathematica"], + ["nb", "application/mathematica"], + ["mathml", "application/mathml+xml"], + ["mbox", "application/mbox"], + ["mscml", "application/mediaservercontrol+xml"], + ["metalink", "application/metalink+xml"], + ["meta4", "application/metalink4+xml"], + ["mets", "application/mets+xml"], + ["maei", "application/mmt-aei+xml"], + ["musd", "application/mmt-usd+xml"], + ["mods", "application/mods+xml"], + ["m21", "application/mp21"], + ["mp21", "application/mp21"], + ["m4p", "application/mp4"], + ["mp4s", "application/mp4"], + ["doc", "application/msword"], + ["dot", "application/msword"], + ["mxf", "application/mxf"], + ["nq", "application/n-quads"], + ["nt", "application/n-triples"], + ["cjs", "application/node"], + ["bin", "application/octet-stream"], + ["bpk", "application/octet-stream"], + ["buffer", "application/octet-stream"], + ["deb", "application/octet-stream"], + ["deploy", "application/octet-stream"], + ["dist", "application/octet-stream"], + ["distz", "application/octet-stream"], + ["dll", "application/octet-stream"], + ["dmg", "application/octet-stream"], + ["dms", "application/octet-stream"], + ["dump", "application/octet-stream"], + ["elc", "application/octet-stream"], + ["exe", "application/octet-stream"], + ["img", "application/octet-stream"], + ["iso", "application/octet-stream"], + ["lrf", "application/octet-stream"], + ["mar", "application/octet-stream"], + ["msi", "application/octet-stream"], + ["msm", "application/octet-stream"], + ["msp", "application/octet-stream"], + ["pkg", "application/octet-stream"], + ["so", "application/octet-stream"], + ["oda", "application/oda"], + ["opf", "application/oebps-package+xml"], + ["ogx", "application/ogg"], + ["omdoc", "application/omdoc+xml"], + ["onepkg", "application/onenote"], + ["onetmp", "application/onenote"], + ["onetoc", "application/onenote"], + ["onetoc2", "application/onenote"], + ["oxps", "application/oxps"], + ["relo", "application/p2p-overlay+xml"], + ["xer", "application/patch-ops-error+xml"], + ["pdf", "application/pdf"], + ["pgp", "application/pgp-encrypted"], + ["asc", "application/pgp-signature"], + ["sig", "application/pgp-signature"], + ["prf", "application/pics-rules"], + ["p10", "application/pkcs10"], + ["p7c", "application/pkcs7-mime"], + ["p7m", "application/pkcs7-mime"], + ["p7s", "application/pkcs7-signature"], + ["p8", "application/pkcs8"], + ["ac", "application/pkix-attr-cert"], + ["cer", "application/pkix-cert"], + ["crl", "application/pkix-crl"], + ["pkipath", "application/pkix-pkipath"], + ["pki", "application/pkixcmp"], + ["pls", "application/pls+xml"], + ["ai", "application/postscript"], + ["eps", "application/postscript"], + ["ps", "application/postscript"], + ["provx", "application/provenance+xml"], + ["pskcxml", "application/pskc+xml"], + ["raml", "application/raml+yaml"], + ["owl", "application/rdf+xml"], + ["rdf", "application/rdf+xml"], + ["rif", "application/reginfo+xml"], + ["rnc", "application/relax-ng-compact-syntax"], + ["rl", "application/resource-lists+xml"], + ["rld", "application/resource-lists-diff+xml"], + ["rs", "application/rls-services+xml"], + ["rapd", "application/route-apd+xml"], + ["sls", "application/route-s-tsid+xml"], + ["rusd", "application/route-usd+xml"], + ["gbr", "application/rpki-ghostbusters"], + ["mft", "application/rpki-manifest"], + ["roa", "application/rpki-roa"], + ["rsd", "application/rsd+xml"], + ["rss", "application/rss+xml"], + ["rtf", "application/rtf"], + ["sbml", "application/sbml+xml"], + ["scq", "application/scvp-cv-request"], + ["scs", "application/scvp-cv-response"], + ["spq", "application/scvp-vp-request"], + ["spp", "application/scvp-vp-response"], + ["sdp", "application/sdp"], + ["senmlx", "application/senml+xml"], + ["sensmlx", "application/sensml+xml"], + ["setpay", "application/set-payment-initiation"], + ["setreg", "application/set-registration-initiation"], + ["shf", "application/shf+xml"], + ["sieve", "application/sieve"], + ["siv", "application/sieve"], + ["smi", "application/smil+xml"], + ["smil", "application/smil+xml"], + ["rq", "application/sparql-query"], + ["srx", "application/sparql-results+xml"], + ["gram", "application/srgs"], + ["grxml", "application/srgs+xml"], + ["sru", "application/sru+xml"], + ["ssdl", "application/ssdl+xml"], + ["ssml", "application/ssml+xml"], + ["swidtag", "application/swid+xml"], + ["tei", "application/tei+xml"], + ["teicorpus", "application/tei+xml"], + ["tfi", "application/thraud+xml"], + ["tsd", "application/timestamped-data"], + ["toml", "application/toml"], + ["trig", "application/trig"], + ["ttml", "application/ttml+xml"], + ["ubj", "application/ubjson"], + ["rsheet", "application/urc-ressheet+xml"], + ["td", "application/urc-targetdesc+xml"], + ["vxml", "application/voicexml+xml"], + ["wasm", "application/wasm"], + ["wgt", "application/widget"], + ["hlp", "application/winhlp"], + ["wsdl", "application/wsdl+xml"], + ["wspolicy", "application/wspolicy+xml"], + ["xaml", "application/xaml+xml"], + ["xav", "application/xcap-att+xml"], + ["xca", "application/xcap-caps+xml"], + ["xdf", "application/xcap-diff+xml"], + ["xel", "application/xcap-el+xml"], + ["xns", "application/xcap-ns+xml"], + ["xenc", "application/xenc+xml"], + ["xht", "application/xhtml+xml"], + ["xhtml", "application/xhtml+xml"], + ["xlf", "application/xliff+xml"], + ["rng", "application/xml"], + ["xml", "application/xml"], + ["xsd", "application/xml"], + ["xsl", "application/xml"], + ["dtd", "application/xml-dtd"], + ["xop", "application/xop+xml"], + ["xpl", "application/xproc+xml"], + ["*xsl", "application/xslt+xml"], + ["xslt", "application/xslt+xml"], + ["xspf", "application/xspf+xml"], + ["mxml", "application/xv+xml"], + ["xhvml", "application/xv+xml"], + ["xvm", "application/xv+xml"], + ["xvml", "application/xv+xml"], + ["yang", "application/yang"], + ["yin", "application/yin+xml"], + ["zip", "application/zip"], + ["*3gpp", "audio/3gpp"], + ["adp", "audio/adpcm"], + ["amr", "audio/amr"], + ["au", "audio/basic"], + ["snd", "audio/basic"], + ["kar", "audio/midi"], + ["mid", "audio/midi"], + ["midi", "audio/midi"], + ["rmi", "audio/midi"], + ["mxmf", "audio/mobile-xmf"], + ["*mp3", "audio/mp3"], + ["m4a", "audio/mp4"], + ["mp4a", "audio/mp4"], + ["m2a", "audio/mpeg"], + ["m3a", "audio/mpeg"], + ["mp2", "audio/mpeg"], + ["mp2a", "audio/mpeg"], + ["mp3", "audio/mpeg"], + ["mpga", "audio/mpeg"], + ["oga", "audio/ogg"], + ["ogg", "audio/ogg"], + ["opus", "audio/ogg"], + ["spx", "audio/ogg"], + ["s3m", "audio/s3m"], + ["sil", "audio/silk"], + ["wav", "audio/wav"], + ["*wav", "audio/wave"], + ["weba", "audio/webm"], + ["xm", "audio/xm"], + ["ttc", "font/collection"], + ["otf", "font/otf"], + ["ttf", "font/ttf"], + ["woff", "font/woff"], + ["woff2", "font/woff2"], + ["exr", "image/aces"], + ["apng", "image/apng"], + ["avif", "image/avif"], + ["bmp", "image/bmp"], + ["cgm", "image/cgm"], + ["drle", "image/dicom-rle"], + ["emf", "image/emf"], + ["fits", "image/fits"], + ["g3", "image/g3fax"], + ["gif", "image/gif"], + ["heic", "image/heic"], + ["heics", "image/heic-sequence"], + ["heif", "image/heif"], + ["heifs", "image/heif-sequence"], + ["hej2", "image/hej2k"], + ["hsj2", "image/hsj2"], + ["ief", "image/ief"], + ["jls", "image/jls"], + ["jp2", "image/jp2"], + ["jpg2", "image/jp2"], + ["jpe", "image/jpeg"], + ["jpeg", "image/jpeg"], + ["jpg", "image/jpeg"], + ["jph", "image/jph"], + ["jhc", "image/jphc"], + ["jpm", "image/jpm"], + ["jpf", "image/jpx"], + ["jpx", "image/jpx"], + ["jxr", "image/jxr"], + ["jxra", "image/jxra"], + ["jxrs", "image/jxrs"], + ["jxs", "image/jxs"], + ["jxsc", "image/jxsc"], + ["jxsi", "image/jxsi"], + ["jxss", "image/jxss"], + ["ktx", "image/ktx"], + ["ktx2", "image/ktx2"], + ["png", "image/png"], + ["sgi", "image/sgi"], + ["svg", "image/svg+xml"], + ["svgz", "image/svg+xml"], + ["t38", "image/t38"], + ["tif", "image/tiff"], + ["tiff", "image/tiff"], + ["tfx", "image/tiff-fx"], + ["webp", "image/webp"], + ["wmf", "image/wmf"], + ["disposition-notification", "message/disposition-notification"], + ["u8msg", "message/global"], + ["u8dsn", "message/global-delivery-status"], + ["u8mdn", "message/global-disposition-notification"], + ["u8hdr", "message/global-headers"], + ["eml", "message/rfc822"], + ["mime", "message/rfc822"], + ["3mf", "model/3mf"], + ["gltf", "model/gltf+json"], + ["glb", "model/gltf-binary"], + ["iges", "model/iges"], + ["igs", "model/iges"], + ["mesh", "model/mesh"], + ["msh", "model/mesh"], + ["silo", "model/mesh"], + ["mtl", "model/mtl"], + ["obj", "model/obj"], + ["stpx", "model/step+xml"], + ["stpz", "model/step+zip"], + ["stpxz", "model/step-xml+zip"], + ["stl", "model/stl"], + ["vrml", "model/vrml"], + ["wrl", "model/vrml"], + ["*x3db", "model/x3d+binary"], + ["x3dbz", "model/x3d+binary"], + ["x3db", "model/x3d+fastinfoset"], + ["*x3dv", "model/x3d+vrml"], + ["x3dvz", "model/x3d+vrml"], + ["x3d", "model/x3d+xml"], + ["x3dz", "model/x3d+xml"], + ["x3dv", "model/x3d-vrml"], + ["appcache", "text/cache-manifest"], + ["manifest", "text/cache-manifest"], + ["ics", "text/calendar"], + ["ifb", "text/calendar"], + ["coffee", "text/coffeescript"], + ["litcoffee", "text/coffeescript"], + ["css", "text/css"], + ["csv", "text/csv"], + ["htm", "text/html"], + ["html", "text/html"], + ["shtml", "text/html"], + ["jade", "text/jade"], + ["jsx", "text/jsx"], + ["less", "text/less"], + ["markdown", "text/markdown"], + ["md", "text/markdown"], + ["mml", "text/mathml"], + ["mdx", "text/mdx"], + ["n3", "text/n3"], + ["conf", "text/plain"], + ["def", "text/plain"], + ["in", "text/plain"], + ["ini", "text/plain"], + ["list", "text/plain"], + ["log", "text/plain"], + ["text", "text/plain"], + ["txt", "text/plain"], + ["rtx", "text/richtext"], + ["*rtf", "text/rtf"], + ["sgm", "text/sgml"], + ["sgml", "text/sgml"], + ["shex", "text/shex"], + ["slim", "text/slim"], + ["slm", "text/slim"], + ["spdx", "text/spdx"], + ["styl", "text/stylus"], + ["stylus", "text/stylus"], + ["tsv", "text/tab-separated-values"], + ["man", "text/troff"], + ["me", "text/troff"], + ["ms", "text/troff"], + ["roff", "text/troff"], + ["t", "text/troff"], + ["tr", "text/troff"], + ["ttl", "text/turtle"], + ["uri", "text/uri-list"], + ["uris", "text/uri-list"], + ["urls", "text/uri-list"], + ["vcard", "text/vcard"], + ["vtt", "text/vtt"], + ["*xml", "text/xml"], + ["yaml", "text/yaml"], + ["yml", "text/yaml"], + ["3gp", "video/3gpp"], + ["3gpp", "video/3gpp"], + ["3g2", "video/3gpp2"], + ["h261", "video/h261"], + ["h263", "video/h263"], + ["h264", "video/h264"], + ["m4s", "video/iso.segment"], + ["jpgv", "video/jpeg"], + ["jpm", "video/jpm"], + ["jpgm", "video/jpm"], + ["mj2", "video/mj2"], + ["mjp2", "video/mj2"], + ["ts", "application/typescript"], + ["mp4", "video/mp4"], + ["mp4v", "video/mp4"], + ["mpg4", "video/mp4"], + ["m1v", "video/mpeg"], + ["m2v", "video/mpeg"], + ["mpe", "video/mpeg"], + ["mpeg", "video/mpeg"], + ["mpg", "video/mpeg"], + ["ogv", "video/ogg"], + ["mov", "video/quicktime"], + ["qt", "video/quicktime"], + ["webm", "video/webm"] + ]); + } +}); + +// packages/isomorphic/multimap.ts +var MultiMap; +var init_multimap = __esm({ + "packages/isomorphic/multimap.ts"() { + "use strict"; + MultiMap = class { + constructor() { + this._map = /* @__PURE__ */ new Map(); + } + set(key, value2) { + let values = this._map.get(key); + if (!values) { + values = []; + this._map.set(key, values); + } + values.push(value2); + } + get(key) { + return this._map.get(key) || []; + } + has(key) { + return this._map.has(key); + } + delete(key, value2) { + const values = this._map.get(key); + if (!values) + return; + if (values.includes(value2)) + this._map.set(key, values.filter((v) => value2 !== v)); + } + deleteAll(key) { + this._map.delete(key); + } + hasValue(key, value2) { + const values = this._map.get(key); + if (!values) + return false; + return values.includes(value2); + } + get size() { + return this._map.size; + } + [Symbol.iterator]() { + return this._map[Symbol.iterator](); + } + keys() { + return this._map.keys(); + } + values() { + const result2 = []; + for (const key of this.keys()) + result2.push(...this.get(key)); + return result2; + } + clear() { + this._map.clear(); + } + }; + } +}); + +// packages/isomorphic/protocolMetainfo.ts +function getMetainfo(metadata) { + return methodMetainfo.get(metadata.type + "." + metadata.method); +} +var methodMetainfo; +var init_protocolMetainfo = __esm({ + "packages/isomorphic/protocolMetainfo.ts"() { + "use strict"; + methodMetainfo = /* @__PURE__ */ new Map([ + ["Android.devices", { internal: true }], + ["AndroidSocket.write", { internal: true }], + ["AndroidSocket.close", { internal: true }], + ["AndroidDevice.wait", { title: "Wait" }], + ["AndroidDevice.fill", { title: 'Fill "{text}"' }], + ["AndroidDevice.tap", { title: "Tap" }], + ["AndroidDevice.drag", { title: "Drag" }], + ["AndroidDevice.fling", { title: "Fling" }], + ["AndroidDevice.longTap", { title: "Long tap" }], + ["AndroidDevice.pinchClose", { title: "Pinch close" }], + ["AndroidDevice.pinchOpen", { title: "Pinch open" }], + ["AndroidDevice.scroll", { title: "Scroll" }], + ["AndroidDevice.swipe", { title: "Swipe" }], + ["AndroidDevice.info", { internal: true }], + ["AndroidDevice.screenshot", { title: "Screenshot" }], + ["AndroidDevice.inputType", { title: "Type" }], + ["AndroidDevice.inputPress", { title: "Press" }], + ["AndroidDevice.inputTap", { title: "Tap" }], + ["AndroidDevice.inputSwipe", { title: "Swipe" }], + ["AndroidDevice.inputDrag", { title: "Drag" }], + ["AndroidDevice.launchBrowser", { title: "Launch browser" }], + ["AndroidDevice.open", { title: "Open app" }], + ["AndroidDevice.shell", { title: "Execute shell command", group: "configuration" }], + ["AndroidDevice.installApk", { title: "Install apk" }], + ["AndroidDevice.push", { title: "Push" }], + ["AndroidDevice.connectToWebView", { title: "Connect to Web View" }], + ["AndroidDevice.close", { internal: true }], + ["APIRequestContext.fetch", { title: '{method} "{url}"' }], + ["APIRequestContext.fetchResponseBody", { title: "Get response body", group: "getter" }], + ["APIRequestContext.fetchLog", { internal: true }], + ["APIRequestContext.storageState", { title: "Get storage state", group: "configuration" }], + ["APIRequestContext.disposeAPIResponse", { internal: true }], + ["APIRequestContext.dispose", { internal: true }], + ["Artifact.pathAfterFinished", { internal: true }], + ["Artifact.saveAs", { internal: true }], + ["Artifact.saveAsStream", { internal: true }], + ["Artifact.failure", { internal: true }], + ["Artifact.stream", { internal: true }], + ["Artifact.cancel", { internal: true }], + ["Artifact.delete", { internal: true }], + ["Stream.read", { internal: true }], + ["Stream.close", { internal: true }], + ["WritableStream.write", { internal: true }], + ["WritableStream.close", { internal: true }], + ["Browser.startServer", { title: "Start server" }], + ["Browser.stopServer", { title: "Stop server" }], + ["Browser.close", { title: "Close browser", pause: true }], + ["Browser.killForTests", { internal: true }], + ["Browser.defaultUserAgentForTest", { internal: true }], + ["Browser.newContext", { title: "Create context" }], + ["Browser.newContextForReuse", { internal: true }], + ["Browser.disconnectFromReusedContext", { internal: true }], + ["Browser.newBrowserCDPSession", { title: "Create CDP session", group: "configuration" }], + ["Browser.startTracing", { title: "Start browser tracing", group: "configuration" }], + ["Browser.stopTracing", { title: "Stop browser tracing", group: "configuration" }], + ["BrowserContext.addCookies", { title: "Add cookies", group: "configuration" }], + ["BrowserContext.addInitScript", { title: "Add init script", group: "configuration" }], + ["BrowserContext.clearCookies", { title: "Clear cookies", group: "configuration" }], + ["BrowserContext.clearPermissions", { title: "Clear permissions", group: "configuration" }], + ["BrowserContext.close", { title: "Close context", pause: true }], + ["BrowserContext.cookies", { title: "Get cookies", group: "getter" }], + ["BrowserContext.exposeBinding", { title: "Expose binding", group: "configuration" }], + ["BrowserContext.grantPermissions", { title: "Grant permissions", group: "configuration" }], + ["BrowserContext.newPage", { title: "Create page" }], + ["BrowserContext.registerSelectorEngine", { internal: true }], + ["BrowserContext.setTestIdAttributeName", { internal: true }], + ["BrowserContext.setExtraHTTPHeaders", { title: "Set extra HTTP headers", group: "configuration" }], + ["BrowserContext.setGeolocation", { title: "Set geolocation", group: "configuration" }], + ["BrowserContext.setHTTPCredentials", { title: "Set HTTP credentials", group: "configuration" }], + ["BrowserContext.setNetworkInterceptionPatterns", { title: "Route requests", group: "route" }], + ["BrowserContext.setWebSocketInterceptionPatterns", { title: "Route WebSockets", group: "route" }], + ["BrowserContext.setOffline", { title: "Set offline mode" }], + ["BrowserContext.storageState", { title: "Get storage state", group: "configuration" }], + ["BrowserContext.setStorageState", { title: "Set storage state", group: "configuration" }], + ["BrowserContext.pause", { title: "Pause" }], + ["BrowserContext.enableRecorder", { internal: true }], + ["BrowserContext.disableRecorder", { internal: true }], + ["BrowserContext.exposeConsoleApi", { internal: true }], + ["BrowserContext.newCDPSession", { title: "Create CDP session", group: "configuration" }], + ["BrowserContext.createTempFiles", { internal: true }], + ["BrowserContext.updateSubscription", { internal: true }], + ["BrowserContext.clockFastForward", { title: 'Fast forward clock "{ticksNumber|ticksString}"' }], + ["BrowserContext.clockInstall", { title: 'Install clock "{timeNumber|timeString}"' }], + ["BrowserContext.clockPauseAt", { title: 'Pause clock "{timeNumber|timeString}"' }], + ["BrowserContext.clockResume", { title: "Resume clock" }], + ["BrowserContext.clockRunFor", { title: 'Run clock "{ticksNumber|ticksString}"' }], + ["BrowserContext.clockSetFixedTime", { title: 'Set fixed time "{timeNumber|timeString}"' }], + ["BrowserContext.clockSetSystemTime", { title: 'Set system time "{timeNumber|timeString}"' }], + ["BrowserContext.credentialsInstall", { title: "Install virtual WebAuthn authenticator", group: "configuration" }], + ["BrowserContext.credentialsCreate", { title: 'Create virtual credential for "{rpId}"', group: "configuration" }], + ["BrowserContext.credentialsGet", { title: "Get virtual credentials", group: "configuration" }], + ["BrowserContext.credentialsDelete", { title: "Delete virtual credential", group: "configuration" }], + ["BrowserType.launch", { title: "Launch browser" }], + ["BrowserType.launchPersistentContext", { title: "Launch persistent context" }], + ["BrowserType.connectOverCDP", { title: "Connect over CDP" }], + ["BrowserType.connectToWorker", { title: "Connect to worker" }], + ["Disposable.dispose", { internal: true }], + ["Electron.launch", { title: "Launch electron" }], + ["ElectronApplication.browserWindow", { internal: true }], + ["ElectronApplication.evaluateExpression", { title: "Evaluate" }], + ["ElectronApplication.evaluateExpressionHandle", { title: "Evaluate" }], + ["ElectronApplication.updateSubscription", { internal: true }], + ["Frame.evalOnSelector", { title: "Evaluate", snapshot: true, pause: true }], + ["Frame.evalOnSelectorAll", { title: "Evaluate", snapshot: true, pause: true }], + ["Frame.addScriptTag", { title: "Add script tag", snapshot: true, pause: true }], + ["Frame.addStyleTag", { title: "Add style tag", snapshot: true, pause: true }], + ["Frame.ariaSnapshot", { title: "Aria snapshot", group: "getter" }], + ["Frame.blur", { title: "Blur", slowMo: true, snapshot: true, pause: true }], + ["Frame.check", { title: "Check", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.click", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.content", { title: "Get content", snapshot: true, pause: true }], + ["Frame.dragAndDrop", { title: "Drag and drop", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.drop", { title: "Drop files or data onto an element", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.dblclick", { title: "Double click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.dispatchEvent", { title: 'Dispatch "{type}"', slowMo: true, snapshot: true, pause: true }], + ["Frame.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }], + ["Frame.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }], + ["Frame.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.focus", { title: "Focus", slowMo: true, snapshot: true, pause: true }], + ["Frame.frameElement", { title: "Get frame element", group: "getter" }], + ["Frame.resolveSelector", { internal: true }], + ["Frame.highlight", { internal: true }], + ["Frame.hideHighlight", { internal: true }], + ["Frame.getAttribute", { title: 'Get attribute "{name}"', snapshot: true, pause: true, group: "getter" }], + ["Frame.goto", { title: 'Navigate to "{url}"', slowMo: true, snapshot: true, pause: true }], + ["Frame.hover", { title: "Hover", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.innerHTML", { title: "Get HTML", snapshot: true, pause: true, group: "getter" }], + ["Frame.innerText", { title: "Get inner text", snapshot: true, pause: true, group: "getter" }], + ["Frame.inputValue", { title: "Get input value", snapshot: true, pause: true, group: "getter" }], + ["Frame.isChecked", { title: "Is checked", snapshot: true, pause: true, group: "getter" }], + ["Frame.isDisabled", { title: "Is disabled", snapshot: true, pause: true, group: "getter" }], + ["Frame.isEnabled", { title: "Is enabled", snapshot: true, pause: true, group: "getter" }], + ["Frame.isHidden", { title: "Is hidden", snapshot: true, pause: true, group: "getter" }], + ["Frame.isVisible", { title: "Is visible", snapshot: true, pause: true, group: "getter" }], + ["Frame.isEditable", { title: "Is editable", snapshot: true, pause: true, group: "getter" }], + ["Frame.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.querySelector", { title: "Query selector", snapshot: true }], + ["Frame.querySelectorAll", { title: "Query selector all", snapshot: true }], + ["Frame.queryCount", { title: "Query count", snapshot: true, pause: true }], + ["Frame.selectOption", { title: "Select option", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.setContent", { title: "Set content", snapshot: true, pause: true }], + ["Frame.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.tap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.textContent", { title: "Get text content", snapshot: true, pause: true, group: "getter" }], + ["Frame.title", { title: "Get page title", group: "getter" }], + ["Frame.type", { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["Frame.waitForTimeout", { title: "Wait for timeout", snapshot: true }], + ["Frame.waitForFunction", { title: "Wait for function", snapshot: true, pause: true }], + ["Frame.waitForSelector", { title: "Wait for selector", snapshot: true }], + ["Frame.expect", { title: 'Expect "{expression}"', snapshot: true, pause: true }], + ["JSHandle.dispose", { internal: true }], + ["ElementHandle.dispose", { internal: true }], + ["JSHandle.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }], + ["ElementHandle.evaluateExpression", { title: "Evaluate", snapshot: true, pause: true }], + ["JSHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }], + ["ElementHandle.evaluateExpressionHandle", { title: "Evaluate", snapshot: true, pause: true }], + ["JSHandle.getPropertyList", { title: "Get property list", group: "getter" }], + ["ElementHandle.getPropertyList", { title: "Get property list", group: "getter" }], + ["JSHandle.getProperty", { title: "Get JS property", group: "getter" }], + ["ElementHandle.getProperty", { title: "Get JS property", group: "getter" }], + ["JSHandle.jsonValue", { title: "Get JSON value", group: "getter" }], + ["ElementHandle.jsonValue", { title: "Get JSON value", group: "getter" }], + ["ElementHandle.evalOnSelector", { title: "Evaluate", snapshot: true, pause: true }], + ["ElementHandle.evalOnSelectorAll", { title: "Evaluate", snapshot: true, pause: true }], + ["ElementHandle.boundingBox", { title: "Get bounding box", snapshot: true, pause: true }], + ["ElementHandle.check", { title: "Check", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.click", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.contentFrame", { title: "Get content frame", group: "getter" }], + ["ElementHandle.dblclick", { title: "Double click", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.dispatchEvent", { title: "Dispatch event", slowMo: true, snapshot: true, pause: true }], + ["ElementHandle.fill", { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.focus", { title: "Focus", slowMo: true, snapshot: true, pause: true }], + ["ElementHandle.getAttribute", { title: "Get attribute", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.hover", { title: "Hover", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.innerHTML", { title: "Get HTML", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.innerText", { title: "Get inner text", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.inputValue", { title: "Get input value", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isChecked", { title: "Is checked", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isDisabled", { title: "Is disabled", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isEditable", { title: "Is editable", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isEnabled", { title: "Is enabled", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isHidden", { title: "Is hidden", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.isVisible", { title: "Is visible", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.ownerFrame", { title: "Get owner frame", group: "getter" }], + ["ElementHandle.press", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.querySelector", { title: "Query selector", snapshot: true }], + ["ElementHandle.querySelectorAll", { title: "Query selector all", snapshot: true }], + ["ElementHandle.screenshot", { title: "Screenshot", snapshot: true, pause: true }], + ["ElementHandle.scrollIntoViewIfNeeded", { title: "Scroll into view", slowMo: true, snapshot: true, pause: true }], + ["ElementHandle.selectOption", { title: "Select option", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.selectText", { title: "Select text", slowMo: true, snapshot: true, pause: true }], + ["ElementHandle.setInputFiles", { title: "Set input files", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.tap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.textContent", { title: "Get text content", snapshot: true, pause: true, group: "getter" }], + ["ElementHandle.type", { title: "Type", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.uncheck", { title: "Uncheck", slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true }], + ["ElementHandle.waitForElementState", { title: "Wait for state", snapshot: true, pause: true }], + ["ElementHandle.waitForSelector", { title: "Wait for selector", snapshot: true }], + ["LocalUtils.zip", { internal: true }], + ["LocalUtils.harOpen", { internal: true }], + ["LocalUtils.harLookup", { internal: true }], + ["LocalUtils.harClose", { internal: true }], + ["LocalUtils.harUnzip", { internal: true }], + ["LocalUtils.connect", { internal: true }], + ["LocalUtils.tracingStarted", { internal: true }], + ["LocalUtils.addStackToTracingNoReply", { internal: true }], + ["LocalUtils.traceDiscarded", { internal: true }], + ["LocalUtils.globToRegex", { internal: true }], + ["Request.response", { internal: true }], + ["Request.rawRequestHeaders", { internal: true }], + ["Route.redirectNavigationRequest", { internal: true }], + ["Route.abort", { title: "Abort request", group: "route" }], + ["Route.continue", { title: "Continue request", group: "route" }], + ["Route.fulfill", { title: "Fulfill request", group: "route" }], + ["WebSocketRoute.connect", { title: "Connect WebSocket to server", group: "route" }], + ["WebSocketRoute.ensureOpened", { internal: true }], + ["WebSocketRoute.sendToPage", { title: "Send WebSocket message", group: "route" }], + ["WebSocketRoute.sendToServer", { title: "Send WebSocket message", group: "route" }], + ["WebSocketRoute.closePage", { internal: true }], + ["WebSocketRoute.closeServer", { internal: true }], + ["Response.body", { title: "Get response body", group: "getter" }], + ["Response.securityDetails", { internal: true }], + ["Response.serverAddr", { internal: true }], + ["Response.rawResponseHeaders", { internal: true }], + ["Response.httpVersion", { internal: true }], + ["Response.sizes", { internal: true }], + ["Page.addInitScript", { title: "Add init script", group: "configuration" }], + ["Page.close", { title: "Close page", pause: true }], + ["Page.runBeforeUnload", { title: "Run beforeunload", pause: true }], + ["Page.clearConsoleMessages", { title: "Clear console messages" }], + ["Page.consoleMessages", { title: "Get console messages", group: "getter" }], + ["Page.emulateMedia", { title: "Emulate media", snapshot: true, pause: true }], + ["Page.exposeBinding", { title: "Expose binding", group: "configuration" }], + ["Page.goBack", { title: "Go back", slowMo: true, snapshot: true, pause: true }], + ["Page.goForward", { title: "Go forward", slowMo: true, snapshot: true, pause: true }], + ["Page.requestGC", { title: "Request garbage collection", group: "configuration" }], + ["Page.registerLocatorHandler", { title: "Register locator handler" }], + ["Page.resolveLocatorHandlerNoReply", { internal: true }], + ["Page.unregisterLocatorHandler", { title: "Unregister locator handler" }], + ["Page.reload", { title: "Reload", slowMo: true, snapshot: true, pause: true }], + ["Page.expectScreenshot", { title: "Expect screenshot", snapshot: true, pause: true }], + ["Page.screenshot", { title: "Screenshot", snapshot: true, pause: true }], + ["Page.setExtraHTTPHeaders", { title: "Set extra HTTP headers", group: "configuration" }], + ["Page.setNetworkInterceptionPatterns", { title: "Route requests", group: "route" }], + ["Page.setWebSocketInterceptionPatterns", { title: "Route WebSockets", group: "route" }], + ["Page.setViewportSize", { title: "Set viewport size", snapshot: true, pause: true }], + ["Page.keyboardDown", { title: 'Key down "{key}"', slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.keyboardUp", { title: 'Key up "{key}"', slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.keyboardInsertText", { title: 'Insert "{text}"', slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.keyboardType", { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.keyboardPress", { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.mouseMove", { title: "Mouse move", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.mouseDown", { title: "Mouse down", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.mouseUp", { title: "Mouse up", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.mouseClick", { title: "Click", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.mouseWheel", { title: "Mouse wheel", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.touchscreenTap", { title: "Tap", slowMo: true, snapshot: true, pause: true, input: true }], + ["Page.clearPageErrors", { title: "Clear page errors" }], + ["Page.pageErrors", { title: "Get page errors", group: "getter" }], + ["Page.pdf", { title: "PDF" }], + ["Page.requests", { title: "Get network requests", group: "getter" }], + ["Page.startJSCoverage", { title: "Start JS coverage", group: "configuration" }], + ["Page.stopJSCoverage", { title: "Stop JS coverage", group: "configuration" }], + ["Page.startCSSCoverage", { title: "Start CSS coverage", group: "configuration" }], + ["Page.stopCSSCoverage", { title: "Stop CSS coverage", group: "configuration" }], + ["Page.bringToFront", { title: "Bring to front" }], + ["Page.pickLocator", { title: "Pick locator", group: "configuration" }], + ["Page.cancelPickLocator", { title: "Cancel pick locator", group: "configuration" }], + ["Page.hideHighlight", { title: "Hide all element highlights", group: "configuration" }], + ["Page.screencastShowOverlay", { title: "Show overlay", group: "configuration" }], + ["Page.screencastRemoveOverlay", { title: "Remove overlay", group: "configuration" }], + ["Page.screencastChapter", { title: "Show chapter overlay", group: "configuration" }], + ["Page.screencastSetOverlayVisible", { title: "Set overlay visibility", group: "configuration" }], + ["Page.screencastShowActions", { title: "Show actions", group: "configuration" }], + ["Page.screencastHideActions", { title: "Remove actions", group: "configuration" }], + ["Page.screencastStart", { title: "Start screencast", group: "configuration" }], + ["Page.screencastFrameAck", { internal: true }], + ["Page.screencastStop", { title: "Stop screencast", group: "configuration" }], + ["Page.updateSubscription", { internal: true }], + ["Page.setDockTile", { internal: true }], + ["Page.webStorageItems", { title: "Get WebStorage items", group: "getter" }], + ["Page.webStorageGetItem", { title: "Get WebStorage item", group: "getter" }], + ["Page.webStorageSetItem", { title: "Set WebStorage item", group: "configuration" }], + ["Page.webStorageRemoveItem", { title: "Remove WebStorage item", group: "configuration" }], + ["Page.webStorageClear", { title: "Clear WebStorage", group: "configuration" }], + ["Root.initialize", { internal: true }], + ["Playwright.newRequest", { title: "Create request context" }], + ["DebugController.initialize", { internal: true }], + ["DebugController.setReportStateChanged", { internal: true }], + ["DebugController.setRecorderMode", { internal: true }], + ["DebugController.highlight", { internal: true }], + ["DebugController.hideHighlight", { internal: true }], + ["DebugController.resume", { internal: true }], + ["DebugController.kill", { internal: true }], + ["SocksSupport.socksConnected", { internal: true }], + ["SocksSupport.socksFailed", { internal: true }], + ["SocksSupport.socksData", { internal: true }], + ["SocksSupport.socksError", { internal: true }], + ["SocksSupport.socksEnd", { internal: true }], + ["JsonPipe.send", { internal: true }], + ["JsonPipe.close", { internal: true }], + ["CDPSession.send", { title: "Send CDP command", group: "configuration" }], + ["CDPSession.detach", { title: "Detach CDP session", group: "configuration" }], + ["BindingCall.reject", { internal: true }], + ["BindingCall.resolve", { internal: true }], + ["Debugger.requestPause", { title: "Pause on next call", group: "configuration" }], + ["Debugger.resume", { title: "Resume", group: "configuration" }], + ["Debugger.next", { title: "Step to next call", group: "configuration" }], + ["Debugger.runTo", { title: "Run to location", group: "configuration" }], + ["Dialog.accept", { title: "Accept dialog" }], + ["Dialog.dismiss", { title: "Dismiss dialog" }], + ["Tracing.tracingStart", { title: "Start tracing", group: "configuration" }], + ["Tracing.tracingStartChunk", { title: "Start tracing", group: "configuration" }], + ["Tracing.tracingGroup", { title: 'Trace "{name}"' }], + ["Tracing.tracingGroupEnd", { title: "Group end" }], + ["Tracing.tracingStopChunk", { title: "Stop tracing", group: "configuration" }], + ["Tracing.tracingStop", { title: "Stop tracing", group: "configuration" }], + ["Tracing.harStart", { internal: true }], + ["Tracing.harExport", { internal: true }], + ["Worker.disconnect", { title: "Disconnect from worker" }], + ["Worker.evaluateExpression", { title: "Evaluate" }], + ["Worker.evaluateExpressionHandle", { title: "Evaluate" }], + ["Worker.updateSubscription", { internal: true }] + ]); + } +}); + +// packages/isomorphic/protocolFormatter.ts +function formatProtocolParam(params2, alternatives) { + return _formatProtocolParam(params2, alternatives)?.replaceAll("\n", "\\n"); +} +function _formatProtocolParam(params2, alternatives) { + if (!params2) + return void 0; + for (const name of alternatives.split("|")) { + if (name === "url") { + try { + const urlObject = new URL(params2[name]); + if (urlObject.protocol === "data:") + return urlObject.protocol; + if (["about:", "chrome:", "edge:"].includes(urlObject.protocol)) + return params2[name]; + return urlObject.pathname + urlObject.search; + } catch (error) { + if (params2[name] !== void 0) + return params2[name]; + } + } + if (name === "timeNumber" && params2[name] !== void 0) { + return new Date(params2[name]).toString(); + } + const value2 = deepParam(params2, name); + if (value2 !== void 0) + return value2; + } +} +function deepParam(params2, name) { + const tokens = name.split("."); + let current = params2; + for (const token of tokens) { + if (typeof current !== "object" || current === null) + return void 0; + current = current[token]; + } + if (current === void 0) + return void 0; + return String(current); +} +function renderTitleForCall(metadata) { + const titleFormat = metadata.title ?? getMetainfo(metadata)?.title ?? metadata.method; + return titleFormat.replace(/\{([^}]+)\}/g, (fullMatch, p1) => { + return formatProtocolParam(metadata.params, p1) ?? fullMatch; + }); +} +function getActionGroup(metadata) { + return getMetainfo(metadata)?.group; +} +var init_protocolFormatter = __esm({ + "packages/isomorphic/protocolFormatter.ts"() { + "use strict"; + init_protocolMetainfo(); + } +}); + +// packages/isomorphic/rtti.ts +function isRegExp2(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function isRegexString(value2) { + try { + new RegExp(value2); + return true; + } catch { + return false; + } +} +function isObject(obj) { + return typeof obj === "object" && obj !== null; +} +function isError(obj) { + return obj instanceof Error || obj && Object.getPrototypeOf(obj)?.name === "Error"; +} +var init_rtti = __esm({ + "packages/isomorphic/rtti.ts"() { + "use strict"; + init_stringUtils(); + } +}); + +// packages/isomorphic/semaphore.ts +var Semaphore; +var init_semaphore = __esm({ + "packages/isomorphic/semaphore.ts"() { + "use strict"; + init_manualPromise(); + Semaphore = class { + constructor(max) { + this._acquired = 0; + this._queue = []; + this._max = max; + } + setMax(max) { + this._max = max; + } + acquire() { + const lock2 = new ManualPromise(); + this._queue.push(lock2); + this._flush(); + return lock2; + } + release() { + --this._acquired; + this._flush(); + } + _flush() { + while (this._acquired < this._max && this._queue.length) { + ++this._acquired; + this._queue.shift().resolve(); + } + } + }; + } +}); + +// packages/isomorphic/formatUtils.ts +function msToString(ms) { + if (ms < 0 || !isFinite(ms)) + return "-"; + if (ms === 0) + return "0ms"; + if (ms < 1e3) + return ms.toFixed(0) + "ms"; + const seconds = ms / 1e3; + if (seconds < 60) + return seconds.toFixed(1) + "s"; + const minutes = seconds / 60; + if (minutes < 60) + return minutes.toFixed(1) + "m"; + const hours = minutes / 60; + if (hours < 24) + return hours.toFixed(1) + "h"; + const days = hours / 24; + return days.toFixed(1) + "d"; +} +function bytesToString(bytes) { + if (bytes < 0 || !isFinite(bytes)) + return "-"; + if (bytes === 0) + return "0"; + if (bytes < 1e3) + return bytes.toFixed(0); + const kb = bytes / 1024; + if (kb < 1e3) + return kb.toFixed(1) + "K"; + const mb = kb / 1024; + if (mb < 1e3) + return mb.toFixed(1) + "M"; + const gb = mb / 1024; + return gb.toFixed(1) + "G"; +} +var init_formatUtils = __esm({ + "packages/isomorphic/formatUtils.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/time.ts +function setTimeOrigin(origin) { + _timeOrigin = origin; + _timeShift = performance.timeOrigin - origin; +} +function timeOrigin() { + return _timeOrigin; +} +function monotonicTime() { + return Math.floor((performance.now() + _timeShift) * 1e3) / 1e3; +} +var _timeOrigin, _timeShift, DEFAULT_PLAYWRIGHT_TIMEOUT, DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT; +var init_time = __esm({ + "packages/isomorphic/time.ts"() { + "use strict"; + _timeOrigin = performance.timeOrigin; + _timeShift = 0; + DEFAULT_PLAYWRIGHT_TIMEOUT = 3e4; + DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT = 3 * 60 * 1e3; + } +}); + +// packages/isomorphic/timeoutRunner.ts +async function raceAgainstDeadline(cb, deadline) { + let timer; + return await Promise.race([ + cb().then((result2) => { + return { result: result2, timedOut: false }; + }), + new Promise((resolve) => { + if (!deadline) + return; + timer = setTimeout(() => resolve({ timedOut: true }), deadline - monotonicTime()); + }) + ]).finally(() => { + clearTimeout(timer); + }); +} +async function pollAgainstDeadline(callback, deadline, [...pollIntervals] = [100, 250, 500, 1e3]) { + const lastPollInterval = pollIntervals.pop() ?? 1e3; + let lastResult; + const wrappedCallback = () => Promise.resolve().then(callback); + while (true) { + const time = monotonicTime(); + if (deadline && time >= deadline) + break; + const received = await raceAgainstDeadline(wrappedCallback, deadline); + if (received.timedOut) + break; + lastResult = received.result.result; + if (!received.result.continuePolling) + return { result: lastResult, timedOut: false }; + const interval = pollIntervals.shift() ?? lastPollInterval; + if (deadline && deadline <= monotonicTime() + interval) + break; + await new Promise((x) => setTimeout(x, interval)); + } + return { timedOut: true, result: lastResult }; +} +var init_timeoutRunner = __esm({ + "packages/isomorphic/timeoutRunner.ts"() { + "use strict"; + init_time(); + } +}); + +// packages/isomorphic/trace/snapshotServer.ts +function removeHash(url3) { + try { + const u = new URL(url3); + u.hash = ""; + return u.toString(); + } catch (e) { + return url3; + } +} +var SnapshotServer; +var init_snapshotServer = __esm({ + "packages/isomorphic/trace/snapshotServer.ts"() { + "use strict"; + SnapshotServer = class { + constructor(snapshotStorage, resourceLoader) { + this._snapshotIds = /* @__PURE__ */ new Map(); + this._snapshotStorage = snapshotStorage; + this._resourceLoader = resourceLoader; + } + serveSnapshot(pageOrFrameId, searchParams, snapshotUrl) { + const snapshot3 = this._snapshot(pageOrFrameId, searchParams); + if (!snapshot3) + return new Response(null, { status: 404 }); + const renderedSnapshot = snapshot3.render(); + this._snapshotIds.set(snapshotUrl, snapshot3); + return new Response(renderedSnapshot.html, { status: 200, headers: { "Content-Type": "text/html; charset=utf-8" } }); + } + async serveClosestScreenshot(pageOrFrameId, searchParams) { + const snapshot3 = this._snapshot(pageOrFrameId, searchParams); + const sha1 = snapshot3?.closestScreenshot(); + if (!sha1) + return new Response(null, { status: 404 }); + return new Response(await this._resourceLoader(sha1)); + } + serveSnapshotInfo(pageOrFrameId, searchParams) { + const snapshot3 = this._snapshot(pageOrFrameId, searchParams); + return this._respondWithJson(snapshot3 ? { + viewport: snapshot3.viewport(), + url: snapshot3.snapshot().frameUrl, + timestamp: snapshot3.snapshot().timestamp, + wallTime: snapshot3.snapshot().wallTime + } : { + error: "No snapshot found" + }); + } + _snapshot(pageOrFrameId, params2) { + const name = params2.get("name"); + return this._snapshotStorage.snapshotByName(pageOrFrameId, name); + } + _respondWithJson(object) { + return new Response(JSON.stringify(object), { + status: 200, + headers: { + "Cache-Control": "public, max-age=31536000", + "Content-Type": "application/json" + } + }); + } + async serveResource(requestUrlAlternatives, method, snapshotUrl) { + let resource; + const snapshot3 = this._snapshotIds.get(snapshotUrl); + for (const requestUrl of requestUrlAlternatives) { + resource = snapshot3?.resourceByUrl(removeHash(requestUrl), method); + if (resource) + break; + } + if (!resource) + return new Response(null, { status: 404 }); + const sha1 = resource.response.content._sha1; + const content = sha1 ? await this._resourceLoader(sha1) || new Blob([]) : new Blob([]); + let contentType = resource.response.content.mimeType; + const isTextEncoding = /^text\/|^application\/(javascript|json)/.test(contentType); + if (isTextEncoding && !contentType.includes("charset")) + contentType = `${contentType}; charset=utf-8`; + const headers = new Headers(); + if (contentType !== "x-unknown") + headers.set("Content-Type", contentType); + for (const { name, value: value2 } of resource.response.headers) + headers.set(name, value2); + headers.delete("Content-Encoding"); + headers.delete("Access-Control-Allow-Origin"); + headers.set("Access-Control-Allow-Origin", "*"); + headers.delete("Content-Length"); + headers.set("Content-Length", String(content.size)); + if (this._snapshotStorage.hasResourceOverride(resource.request.url)) + headers.set("Cache-Control", "no-store, no-cache, max-age=0"); + else + headers.set("Cache-Control", "public, max-age=31536000"); + const { status } = resource.response; + const isNullBodyStatus = status === 101 || status === 204 || status === 205 || status === 304; + return new Response(isNullBodyStatus ? null : content, { + headers, + status: resource.response.status, + statusText: resource.response.statusText + }); + } + }; + } +}); + +// packages/isomorphic/urlMatch.ts +function isHttpUrl(url3, base) { + try { + return ["http:", "https:"].includes(new URL(url3, base).protocol); + } catch { + return false; + } +} +function globToRegexPattern(glob) { + const tokens = ["^"]; + let inGroup = false; + for (let i = 0; i < glob.length; ++i) { + const c = glob[i]; + if (c === "\\" && i + 1 < glob.length) { + const char = glob[++i]; + tokens.push(escapedChars.has(char) ? "\\" + char : char); + continue; + } + if (c === "*") { + const charBefore = glob[i - 1]; + let starCount = 1; + while (glob[i + 1] === "*") { + starCount++; + i++; + } + if (starCount > 1) { + const charAfter = glob[i + 1]; + if (charAfter === "/") { + if (charBefore === "/") + tokens.push("((.+/)|)"); + else + tokens.push("(.*/)"); + ++i; + } else { + tokens.push("(.*)"); + } + } else { + tokens.push("([^/]*)"); + } + continue; + } + switch (c) { + case "{": + if (inGroup) + throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: nested '{' is not supported`); + inGroup = true; + tokens.push("("); + break; + case "}": + if (!inGroup) + throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: unmatched '}'`); + inGroup = false; + tokens.push(")"); + break; + case ",": + if (inGroup) { + tokens.push("|"); + break; + } + tokens.push("\\" + c); + break; + default: + tokens.push(escapedChars.has(c) ? "\\" + c : c); + } + } + if (inGroup) + throw new Error(`Invalid glob pattern ${JSON.stringify(glob)}: unmatched '{'`); + tokens.push("$"); + return tokens.join(""); +} +function isRegExp3(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function serializeURLPattern(v) { + return { + hash: v.hash, + hostname: v.hostname, + password: v.password, + pathname: v.pathname, + port: v.port, + protocol: v.protocol, + search: v.search, + username: v.username + }; +} +function serializeURLMatch(match) { + if (isString(match)) + return { glob: match }; + if (isRegExp3(match)) + return { regexSource: match.source, regexFlags: match.flags }; + if (isURLPattern(match)) + return { urlPattern: serializeURLPattern(match) }; + return void 0; +} +function deserializeURLPattern(v) { + if (typeof globalThis.URLPattern !== "function") + return () => true; + return new globalThis.URLPattern({ + hash: v.hash, + hostname: v.hostname, + password: v.password, + pathname: v.pathname, + port: v.port, + protocol: v.protocol, + search: v.search, + username: v.username + }); +} +function deserializeURLMatch(match) { + if (match.regexSource) + return new RegExp(match.regexSource, match.regexFlags); + if (match.urlPattern) + return deserializeURLPattern(match.urlPattern); + return match.glob; +} +function urlMatchesEqual(match1, match2) { + if (isRegExp3(match1) && isRegExp3(match2)) + return match1.source === match2.source && match1.flags === match2.flags; + return match1 === match2; +} +function urlMatches(baseURL, urlString, match, webSocketUrl) { + if (match === void 0 || match === "") + return true; + if (isString(match)) + match = new RegExp(resolveGlobToRegexPattern(baseURL, match, webSocketUrl)); + if (isRegExp3(match)) { + match.lastIndex = 0; + return match.test(urlString); + } + const url3 = parseURL(urlString); + if (!url3) + return false; + if (isURLPattern(match)) + return match.test(url3.href); + if (typeof match !== "function") + throw new Error("url parameter should be string, RegExp, URLPattern or function"); + return match(url3); +} +function resolveGlobToRegexPattern(baseURL, glob, webSocketUrl) { + if (webSocketUrl) + baseURL = toWebSocketBaseUrl(baseURL); + glob = resolveGlobBase(baseURL, glob); + return globToRegexPattern(glob); +} +function toWebSocketBaseUrl(baseURL) { + if (baseURL && /^https?:\/\//i.test(baseURL)) + baseURL = baseURL.replace(/^https?/i, (scheme2) => scheme2.toLowerCase() === "https" ? "wss" : "ws"); + return baseURL; +} +function resolveGlobBase(baseURL, match) { + if (!match.startsWith("*")) { + let mapToken2 = function(original, replacement) { + if (original.length === 0) + return ""; + tokenMap.set(replacement, original); + return replacement; + }; + var mapToken = mapToken2; + const tokenMap = /* @__PURE__ */ new Map(); + match = match.replaceAll(/\\\\\?/g, "?"); + if (match.startsWith("about:") || match.startsWith("data:") || match.startsWith("chrome:") || match.startsWith("edge:") || match.startsWith("file:")) + return match; + const relativePath = match.split("/").map((token, index) => { + if (token === "." || token === ".." || token === "") + return token; + if (index === 0 && token.endsWith(":")) { + if (token.indexOf("*") !== -1 || token.indexOf("{") !== -1) + return mapToken2(token, "http:"); + return token; + } + if (!/[*?{}\\]/.test(token)) + return token; + const questionIndex = token.indexOf("?"); + if (questionIndex === -1) + return mapToken2(token, `$_${index}_$`); + const newPrefix = mapToken2(token.substring(0, questionIndex), `$_${index}_$`); + const newSuffix = mapToken2(token.substring(questionIndex), `?$_${index}_$`); + return newPrefix + newSuffix; + }).join("/"); + const result2 = resolveBaseURL(baseURL, relativePath); + let resolved = result2.resolved; + for (const [token, original] of tokenMap) { + const normalize = result2.caseInsensitivePart?.includes(token); + const replacement = normalize ? original.toLowerCase() : original; + resolved = resolved.replace(token, () => replacement); + } + match = resolved; + } + return match; +} +function parseURL(url3) { + try { + return new URL(url3); + } catch (e) { + return null; + } +} +function constructURLBasedOnBaseURL(baseURL, givenURL) { + try { + return resolveBaseURL(baseURL, givenURL).resolved; + } catch (e) { + return givenURL; + } +} +function resolveBaseURL(baseURL, givenURL) { + try { + const url3 = new URL(givenURL, baseURL); + const resolved = url3.toString(); + const caseInsensitivePrefix = url3.origin; + return { resolved, caseInsensitivePart: caseInsensitivePrefix }; + } catch (e) { + return { resolved: givenURL }; + } +} +var escapedChars, isURLPattern; +var init_urlMatch = __esm({ + "packages/isomorphic/urlMatch.ts"() { + "use strict"; + init_stringUtils(); + escapedChars = /* @__PURE__ */ new Set(["$", "^", "+", ".", "*", "(", ")", "|", "\\", "?", "{", "}", "[", "]"]); + isURLPattern = (v) => typeof globalThis.URLPattern === "function" && v instanceof globalThis.URLPattern; + } +}); + +// packages/isomorphic/locatorUtils.ts +function getByAttributeTextSelector(attrName, text2, options) { + return `internal:attr=[${attrName}=${escapeForAttributeSelector(text2, options?.exact || false)}]`; +} +function encodeTestIdAttributeName(testIdAttributeName2) { + return testIdAttributeName2.includes(",") ? JSON.stringify(testIdAttributeName2) : testIdAttributeName2; +} +function getByTestIdSelector(testIdAttributeName2, testId) { + return `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName2)}=${escapeForAttributeSelector(testId, true)}]`; +} +function getByLabelSelector(text2, options) { + return "internal:label=" + escapeForTextSelector(text2, !!options?.exact); +} +function getByAltTextSelector(text2, options) { + return getByAttributeTextSelector("alt", text2, options); +} +function getByTitleSelector(text2, options) { + return getByAttributeTextSelector("title", text2, options); +} +function getByPlaceholderSelector(text2, options) { + return getByAttributeTextSelector("placeholder", text2, options); +} +function getByTextSelector(text2, options) { + return "internal:text=" + escapeForTextSelector(text2, !!options?.exact); +} +function getByRoleSelector(role, options = {}) { + const props = []; + if (options.checked !== void 0) + props.push(["checked", String(options.checked)]); + if (options.disabled !== void 0) + props.push(["disabled", String(options.disabled)]); + if (options.selected !== void 0) + props.push(["selected", String(options.selected)]); + if (options.expanded !== void 0) + props.push(["expanded", String(options.expanded)]); + if (options.includeHidden !== void 0) + props.push(["include-hidden", String(options.includeHidden)]); + if (options.level !== void 0) + props.push(["level", String(options.level)]); + if (options.name !== void 0) + props.push(["name", escapeForAttributeSelector(options.name, !!options.exact)]); + if (options.description !== void 0) + props.push(["description", escapeForAttributeSelector(options.description, !!options.exact)]); + if (options.pressed !== void 0) + props.push(["pressed", String(options.pressed)]); + return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`; +} +var init_locatorUtils = __esm({ + "packages/isomorphic/locatorUtils.ts"() { + "use strict"; + init_stringUtils(); + } +}); + +// packages/isomorphic/locatorParser.ts +function parseLocator(locator2, testIdAttributeName2) { + locator2 = locator2.replace(/AriaRole\s*\.\s*([\w]+)/g, (_, group) => group.toLowerCase()).replace(/(get_by_role|getByRole)\s*\(\s*(?:["'`])([^'"`]+)['"`]/g, (_, group1, group2) => `${group1}(${group2.toLowerCase()}`); + const params2 = []; + let template = ""; + for (let i = 0; i < locator2.length; ++i) { + const quote5 = locator2[i]; + if (quote5 !== '"' && quote5 !== "'" && quote5 !== "`" && quote5 !== "/") { + template += quote5; + continue; + } + const isRegexEscaping = locator2[i - 1] === "r" || locator2[i] === "/"; + ++i; + let text2 = ""; + while (i < locator2.length) { + if (locator2[i] === "\\") { + if (isRegexEscaping) { + if (locator2[i + 1] !== quote5) + text2 += locator2[i]; + ++i; + text2 += locator2[i]; + } else { + ++i; + if (locator2[i] === "n") + text2 += "\n"; + else if (locator2[i] === "r") + text2 += "\r"; + else if (locator2[i] === "t") + text2 += " "; + else + text2 += locator2[i]; + } + ++i; + continue; + } + if (locator2[i] !== quote5) { + text2 += locator2[i++]; + continue; + } + break; + } + params2.push({ quote: quote5, text: text2 }); + template += (quote5 === "/" ? "r" : "") + "$" + params2.length; + } + template = template.toLowerCase().replace(/get_by_alt_text/g, "getbyalttext").replace(/get_by_test_id/g, "getbytestid").replace(/get_by_([\w]+)/g, "getby$1").replace(/has_not_text/g, "hasnottext").replace(/has_text/g, "hastext").replace(/has_not/g, "hasnot").replace(/frame_locator/g, "framelocator").replace(/content_frame/g, "contentframe").replace(/[{}\s]/g, "").replace(/new\(\)/g, "").replace(/new[\w]+\.[\w]+options\(\)/g, "").replace(/\.set/g, ",set").replace(/\.or_\(/g, "or(").replace(/\.and_\(/g, "and(").replace(/:/g, "=").replace(/,re\.ignorecase/g, "i").replace(/,pattern.case_insensitive/g, "i").replace(/,regexoptions.ignorecase/g, "i").replace(/re.compile\(([^)]+)\)/g, "$1").replace(/pattern.compile\(([^)]+)\)/g, "r$1").replace(/newregex\(([^)]+)\)/g, "r$1").replace(/string=/g, "=").replace(/regex=/g, "=").replace(/,,/g, ",").replace(/,\)/g, ")"); + const preferredQuote = params2.map((p) => p.quote).filter((quote5) => "'\"`".includes(quote5))[0]; + return { selector: transform(template, params2, testIdAttributeName2), preferredQuote }; +} +function countParams(template) { + return [...template.matchAll(/\$\d+/g)].length; +} +function shiftParams(template, sub) { + return template.replace(/\$(\d+)/g, (_, ordinal) => `$${ordinal - sub}`); +} +function transform(template, params2, testIdAttributeName2) { + while (true) { + const hasMatch = template.match(/filter\(,?(has=|hasnot=|sethas\(|sethasnot\()/); + if (!hasMatch) + break; + const start3 = hasMatch.index + hasMatch[0].length; + let balance = 0; + let end = start3; + for (; end < template.length; end++) { + if (template[end] === "(") + balance++; + else if (template[end] === ")") + balance--; + if (balance < 0) + break; + } + let prefix = template.substring(0, start3); + let extraSymbol = 0; + if (["sethas(", "sethasnot("].includes(hasMatch[1])) { + extraSymbol = 1; + prefix = prefix.replace(/sethas\($/, "has=").replace(/sethasnot\($/, "hasnot="); + } + const paramsCountBeforeHas = countParams(template.substring(0, start3)); + const hasTemplate = shiftParams(template.substring(start3, end), paramsCountBeforeHas); + const paramsCountInHas = countParams(hasTemplate); + const hasParams = params2.slice(paramsCountBeforeHas, paramsCountBeforeHas + paramsCountInHas); + const hasSelector = JSON.stringify(transform(hasTemplate, hasParams, testIdAttributeName2)); + template = prefix.replace(/=$/, "2=") + `$${paramsCountBeforeHas + 1}` + shiftParams(template.substring(end + extraSymbol), paramsCountInHas - 1); + const paramsBeforeHas = params2.slice(0, paramsCountBeforeHas); + const paramsAfterHas = params2.slice(paramsCountBeforeHas + paramsCountInHas); + params2 = paramsBeforeHas.concat([{ quote: '"', text: hasSelector }]).concat(paramsAfterHas); + } + template = template.replace(/\,set([\w]+)\(([^)]+)\)/g, (_, group1, group2) => "," + group1.toLowerCase() + "=" + group2.toLowerCase()).replace(/framelocator\(([^)]+)\)/g, "$1.internal:control=enter-frame").replace(/contentframe(\(\))?/g, "internal:control=enter-frame").replace(/locator\(([^)]+),hastext=([^),]+)\)/g, "locator($1).internal:has-text=$2").replace(/locator\(([^)]+),hasnottext=([^),]+)\)/g, "locator($1).internal:has-not-text=$2").replace(/locator\(([^)]+),hastext=([^),]+)\)/g, "locator($1).internal:has-text=$2").replace(/locator\(([^)]+)\)/g, "$1").replace(/getbyrole\(([^)]+)\)/g, "internal:role=$1").replace(/getbytext\(([^)]+)\)/g, "internal:text=$1").replace(/getbylabel\(([^)]+)\)/g, "internal:label=$1").replace(/getbytestid\(([^)]+)\)/g, `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName2)}=$1]`).replace(/getby(placeholder|alt|title)(?:text)?\(([^)]+)\)/g, "internal:attr=[$1=$2]").replace(/first(\(\))?/g, "nth=0").replace(/last(\(\))?/g, "nth=-1").replace(/nth\(([^)]+)\)/g, "nth=$1").replace(/filter\(,?visible=true\)/g, "visible=true").replace(/filter\(,?visible=false\)/g, "visible=false").replace(/filter\(,?hastext=([^)]+)\)/g, "internal:has-text=$1").replace(/filter\(,?hasnottext=([^)]+)\)/g, "internal:has-not-text=$1").replace(/filter\(,?has2=([^)]+)\)/g, "internal:has=$1").replace(/filter\(,?hasnot2=([^)]+)\)/g, "internal:has-not=$1").replace(/,exact=false/g, "").replace(/(,name=\$\d+)(,description=\$\d+),exact=true/g, "$1s$2s").replace(/,exact=true/g, "s").replace(/,includehidden=/g, ",include-hidden=").replace(/\,/g, "]["); + const parts = template.split("."); + for (let index = 0; index < parts.length - 1; index++) { + if (parts[index] === "internal:control=enter-frame" && parts[index + 1].startsWith("nth=")) { + const [nth] = parts.splice(index, 1); + parts.splice(index + 1, 0, nth); + } + } + return parts.map((t) => { + if (!t.startsWith("internal:") || t === "internal:control") + return t.replace(/\$(\d+)/g, (_, ordinal) => { + const param = params2[+ordinal - 1]; + return param.text; + }); + t = t.includes("[") ? t.replace(/\]/, "") + "]" : t; + t = t.replace(/(?:r)\$(\d+)(i)?/g, (_, ordinal, suffix) => { + const param = params2[+ordinal - 1]; + if (t.startsWith("internal:attr") || t.startsWith("internal:testid") || t.startsWith("internal:role")) + return escapeForAttributeSelector(new RegExp(param.text), false) + (suffix || ""); + return escapeForTextSelector(new RegExp(param.text, suffix), false); + }).replace(/\$(\d+)(i|s)?/g, (_, ordinal, suffix) => { + const param = params2[+ordinal - 1]; + if (t.startsWith("internal:has=") || t.startsWith("internal:has-not=")) + return param.text; + if (t.startsWith("internal:testid")) + return escapeForAttributeSelector(param.text, true); + if (t.startsWith("internal:attr") || t.startsWith("internal:role")) + return escapeForAttributeSelector(param.text, suffix === "s"); + return escapeForTextSelector(param.text, suffix === "s"); + }); + return t; + }).join(" >> "); +} +function locatorOrSelectorAsSelector(language, locator2, testIdAttributeName2 = "data-testid") { + try { + return unsafeLocatorOrSelectorAsSelector(language, locator2, testIdAttributeName2); + } catch (e) { + return ""; + } +} +function unsafeLocatorOrSelectorAsSelector(language, locator2, testIdAttributeName2 = "data-testid") { + try { + parseSelector(locator2); + return locator2; + } catch (e) { + } + const { selector, preferredQuote } = parseLocator(locator2, testIdAttributeName2); + const locators = asLocators(language, selector, void 0, void 0, preferredQuote); + const digest = digestForComparison(language, locator2); + if (locators.some((candidate) => digestForComparison(language, candidate) === digest)) + return selector; + return ""; +} +function digestForComparison(language, locator2) { + locator2 = locator2.replace(/\s/g, ""); + if (language === "javascript") + locator2 = locator2.replace(/\\?["`]/g, "'").replace(/,{}/g, ""); + return locator2; +} +var init_locatorParser = __esm({ + "packages/isomorphic/locatorParser.ts"() { + "use strict"; + init_locatorGenerators(); + init_locatorUtils(); + init_selectorParser(); + init_stringUtils(); + } +}); + +// packages/isomorphic/trace/snapshotRenderer.ts +function findClosest(items, metric, target) { + return items.find((item, index) => { + if (index === items.length - 1) + return true; + const next = items[index + 1]; + return Math.abs(metric(item) - target) < Math.abs(metric(next) - target); + }); +} +function isNodeNameAttributesChildNodesSnapshot(n) { + return Array.isArray(n) && typeof n[0] === "string"; +} +function isSubtreeReferenceSnapshot(n) { + return Array.isArray(n) && Array.isArray(n[0]); +} +function snapshotNodes(snapshot3) { + if (!snapshot3._nodes) { + const nodes = []; + const visit = (n) => { + if (typeof n === "string") { + nodes.push(n); + } else if (isNodeNameAttributesChildNodesSnapshot(n)) { + const [, , ...children] = n; + for (const child of children) + visit(child); + nodes.push(n); + } + }; + visit(snapshot3.html); + snapshot3._nodes = nodes; + } + return snapshot3._nodes; +} +function snapshotScript(viewport, ...targetIds) { + function applyPlaywrightAttributes(blankSnapshotUrl2, viewport2, ...targetIds2) { + const win = window; + const searchParams = new URLSearchParams(win.location.search); + const shouldPopulateCanvasFromScreenshot = searchParams.has("shouldPopulateCanvasFromScreenshot"); + const isUnderTest2 = searchParams.has("isUnderTest"); + const frameBoundingRectsInfo = { + viewport: viewport2, + frames: /* @__PURE__ */ new WeakMap() + }; + win["__playwright_frame_bounding_rects__"] = frameBoundingRectsInfo; + const kPointerWarningTitle = "Recorded click position in absolute coordinates did not match the center of the clicked element. This is either due to the use of provided offset, or due to a difference between the test runner and the trace viewer operating systems."; + const scrollTops = []; + const scrollLefts = []; + const targetElements = []; + const canvasElements = []; + let topSnapshotWindow = win; + while (topSnapshotWindow !== topSnapshotWindow.parent && !topSnapshotWindow.location.pathname.match(/\/page@[a-z0-9]+$/)) + topSnapshotWindow = topSnapshotWindow.parent; + const visit = (root) => { + for (const e of root.querySelectorAll(`[__playwright_scroll_top_]`)) + scrollTops.push(e); + for (const e of root.querySelectorAll(`[__playwright_scroll_left_]`)) + scrollLefts.push(e); + for (const element3 of root.querySelectorAll(`[__playwright_value_]`)) { + const inputElement = element3; + if (inputElement.type !== "file") + inputElement.value = inputElement.getAttribute("__playwright_value_"); + element3.removeAttribute("__playwright_value_"); + } + for (const element3 of root.querySelectorAll(`[__playwright_checked_]`)) { + element3.checked = element3.getAttribute("__playwright_checked_") === "true"; + element3.removeAttribute("__playwright_checked_"); + } + for (const element3 of root.querySelectorAll(`[__playwright_selected_]`)) { + element3.selected = element3.getAttribute("__playwright_selected_") === "true"; + element3.removeAttribute("__playwright_selected_"); + } + for (const element3 of root.querySelectorAll(`[__playwright_popover_open_]`)) { + try { + element3.showPopover(); + } catch { + } + element3.removeAttribute("__playwright_popover_open_"); + } + for (const element3 of root.querySelectorAll(`[__playwright_dialog_open_]`)) { + try { + if (element3.getAttribute("__playwright_dialog_open_") === "modal") + element3.showModal(); + else + element3.show(); + } catch { + } + element3.removeAttribute("__playwright_dialog_open_"); + } + const highlightTarget = (target) => { + const style = target.style; + style.outline = "2px solid #006ab1"; + style.backgroundColor = "#6fa8dc7f"; + targetElements.push(target); + }; + for (const target of root.querySelectorAll(`[__playwright_target__=""]`)) + highlightTarget(target); + for (const targetId of targetIds2) { + if (!targetId) + continue; + for (const target of root.querySelectorAll(`[__playwright_target__="${targetId}"]`)) + highlightTarget(target); + } + for (const iframe of root.querySelectorAll("iframe, frame")) { + const boundingRectJson = iframe.getAttribute("__playwright_bounding_rect__"); + iframe.removeAttribute("__playwright_bounding_rect__"); + const boundingRect = boundingRectJson ? JSON.parse(boundingRectJson) : void 0; + if (boundingRect) + frameBoundingRectsInfo.frames.set(iframe, { boundingRect, scrollLeft: 0, scrollTop: 0 }); + const src = iframe.getAttribute("__playwright_src__"); + if (!src) { + iframe.setAttribute("src", blankSnapshotUrl2); + } else { + const url3 = new URL(win.location.href); + const index = url3.pathname.lastIndexOf("/snapshot/"); + if (index !== -1) + url3.pathname = url3.pathname.substring(0, index + 1); + url3.pathname += src.substring(1); + iframe.setAttribute("src", url3.toString()); + } + } + { + const body = root.querySelector(`body[__playwright_custom_elements__]`); + if (body && win.customElements) { + const customElements = (body.getAttribute("__playwright_custom_elements__") || "").split(","); + for (const elementName of customElements) + win.customElements.define(elementName, class extends HTMLElement { + }); + } + } + for (const element3 of root.querySelectorAll(`template[__playwright_shadow_root_]`)) { + const template = element3; + const shadowRoot = template.parentElement.attachShadow({ mode: "open" }); + shadowRoot.appendChild(template.content); + template.remove(); + visit(shadowRoot); + } + for (const element3 of root.querySelectorAll("a")) + element3.addEventListener("click", (event) => { + event.preventDefault(); + }); + if ("adoptedStyleSheets" in root) { + const adoptedSheets = [...root.adoptedStyleSheets]; + for (const element3 of root.querySelectorAll(`template[__playwright_style_sheet_]`)) { + const template = element3; + const sheet = new CSSStyleSheet(); + sheet.replaceSync(template.getAttribute("__playwright_style_sheet_")); + adoptedSheets.push(sheet); + } + root.adoptedStyleSheets = adoptedSheets; + } + canvasElements.push(...root.querySelectorAll("canvas")); + }; + const onLoad = () => { + win.removeEventListener("load", onLoad); + for (const element3 of scrollTops) { + element3.scrollTop = +element3.getAttribute("__playwright_scroll_top_"); + element3.removeAttribute("__playwright_scroll_top_"); + if (frameBoundingRectsInfo.frames.has(element3)) + frameBoundingRectsInfo.frames.get(element3).scrollTop = element3.scrollTop; + } + for (const element3 of scrollLefts) { + element3.scrollLeft = +element3.getAttribute("__playwright_scroll_left_"); + element3.removeAttribute("__playwright_scroll_left_"); + if (frameBoundingRectsInfo.frames.has(element3)) + frameBoundingRectsInfo.frames.get(element3).scrollLeft = element3.scrollLeft; + } + win.document.styleSheets[0].disabled = true; + const search = new URL(win.location.href).searchParams; + const isTopFrame = win === topSnapshotWindow; + if (isTopFrame && search.get("pointX") && search.get("pointY")) { + const pointX = +search.get("pointX"); + const pointY = +search.get("pointY"); + const pointElement = win.document.createElement("x-pw-pointer"); + pointElement.style.position = "fixed"; + pointElement.style.backgroundColor = "#f44336"; + pointElement.style.width = "20px"; + pointElement.style.height = "20px"; + pointElement.style.borderRadius = "10px"; + pointElement.style.margin = "-10px 0 0 -10px"; + pointElement.style.zIndex = "2147483646"; + pointElement.style.display = "flex"; + pointElement.style.alignItems = "center"; + pointElement.style.justifyContent = "center"; + const target = targetElements[0]; + const targetBox = target?.getBoundingClientRect(); + const targetCenter = target ? { x: targetBox.left + targetBox.width / 2, y: targetBox.top + targetBox.height / 2 } : null; + pointElement.style.left = (targetCenter?.x ?? pointX) + "px"; + pointElement.style.top = (targetCenter?.y ?? pointY) + "px"; + const isAligned = !targetCenter || Math.abs(targetCenter.x - pointX) <= 10 && Math.abs(targetCenter.y - pointY) <= 10; + if (!isAligned) { + const warningElement = win.document.createElement("x-pw-pointer-warning"); + warningElement.textContent = "\u26A0"; + warningElement.style.fontSize = "19px"; + warningElement.style.color = "white"; + warningElement.style.marginTop = "-3.5px"; + warningElement.style.userSelect = "none"; + pointElement.appendChild(warningElement); + pointElement.setAttribute("title", kPointerWarningTitle); + } + win.document.documentElement.appendChild(pointElement); + } + if (canvasElements.length > 0) { + let drawCheckerboard2 = function(context2, canvas) { + function createCheckerboardPattern() { + const pattern = win.document.createElement("canvas"); + pattern.width = pattern.width / Math.floor(pattern.width / 24); + pattern.height = pattern.height / Math.floor(pattern.height / 24); + const context3 = pattern.getContext("2d"); + context3.fillStyle = "lightgray"; + context3.fillRect(0, 0, pattern.width, pattern.height); + context3.fillStyle = "white"; + context3.fillRect(0, 0, pattern.width / 2, pattern.height / 2); + context3.fillRect(pattern.width / 2, pattern.height / 2, pattern.width, pattern.height); + return context3.createPattern(pattern, "repeat"); + } + context2.fillStyle = createCheckerboardPattern(); + context2.fillRect(0, 0, canvas.width, canvas.height); + }; + var drawCheckerboard = drawCheckerboard2; + const img = new Image(); + img.onload = () => { + for (const canvas of canvasElements) { + const context2 = canvas.getContext("2d"); + const boundingRectAttribute = canvas.getAttribute("__playwright_bounding_rect__"); + canvas.removeAttribute("__playwright_bounding_rect__"); + if (!boundingRectAttribute) + continue; + let boundingRect; + try { + boundingRect = JSON.parse(boundingRectAttribute); + } catch (e) { + continue; + } + let currWindow = win; + while (currWindow !== topSnapshotWindow) { + const iframe = currWindow.frameElement; + currWindow = currWindow.parent; + const iframeInfo = currWindow["__playwright_frame_bounding_rects__"]?.frames.get(iframe); + if (!iframeInfo?.boundingRect) + break; + const leftOffset = iframeInfo.boundingRect.left - iframeInfo.scrollLeft; + const topOffset = iframeInfo.boundingRect.top - iframeInfo.scrollTop; + boundingRect.left += leftOffset; + boundingRect.top += topOffset; + boundingRect.right += leftOffset; + boundingRect.bottom += topOffset; + } + const { width, height } = topSnapshotWindow["__playwright_frame_bounding_rects__"].viewport; + boundingRect.left = boundingRect.left / width; + boundingRect.top = boundingRect.top / height; + boundingRect.right = boundingRect.right / width; + boundingRect.bottom = boundingRect.bottom / height; + const partiallyUncaptured = boundingRect.right > 1 || boundingRect.bottom > 1; + const fullyUncaptured = boundingRect.left > 1 || boundingRect.top > 1; + if (fullyUncaptured) { + canvas.title = `Playwright couldn't capture canvas contents because it's located outside the viewport.`; + continue; + } + drawCheckerboard2(context2, canvas); + if (shouldPopulateCanvasFromScreenshot) { + context2.drawImage(img, boundingRect.left * img.width, boundingRect.top * img.height, (boundingRect.right - boundingRect.left) * img.width, (boundingRect.bottom - boundingRect.top) * img.height, 0, 0, canvas.width, canvas.height); + if (partiallyUncaptured) + canvas.title = `Playwright couldn't capture full canvas contents because it's located partially outside the viewport.`; + else + canvas.title = `Canvas contents are displayed on a best-effort basis based on viewport screenshots taken during test execution.`; + } else { + canvas.title = "Canvas content display is disabled."; + } + if (isUnderTest2) + console.log(`canvas drawn:`, JSON.stringify([boundingRect.left, boundingRect.top, boundingRect.right - boundingRect.left, boundingRect.bottom - boundingRect.top].map((v) => Math.floor(v * 100)))); + } + }; + img.onerror = () => { + for (const canvas of canvasElements) { + const context2 = canvas.getContext("2d"); + drawCheckerboard2(context2, canvas); + canvas.title = `Playwright couldn't show canvas contents because the screenshot failed to load.`; + } + }; + img.src = location.href.replace("/snapshot", "/closest-screenshot"); + } + }; + const onDOMContentLoaded = () => visit(win.document); + win.addEventListener("load", onLoad); + win.addEventListener("DOMContentLoaded", onDOMContentLoaded); + } + const safe = (value2) => JSON.stringify(value2).replace(/ `, ${safe(String(id))}`).join("")})`; +} +function rewriteURLForCustomProtocol(href) { + if (href.startsWith(kLegacyBlobPrefix)) + href = href.substring(kLegacyBlobPrefix.length); + try { + const url3 = new URL(href); + if (url3.protocol === "javascript:" || url3.protocol === "vbscript:") + return "javascript:void(0)"; + const isBlob = url3.protocol === "blob:"; + const isFile = url3.protocol === "file:"; + if (!isBlob && !isFile && schemas.includes(url3.protocol)) + return href; + const prefix = "pw-" + url3.protocol.slice(0, url3.protocol.length - 1); + if (!isFile) + url3.protocol = "https:"; + url3.hostname = url3.hostname ? `${prefix}--${url3.hostname}` : prefix; + if (isFile) { + url3.protocol = "https:"; + } + return url3.toString(); + } catch { + return href; + } +} +function rewriteURLsInStyleSheetForCustomProtocol(text2) { + return text2.replace(urlInCSSRegex, (match, protocol) => { + const isBlob = protocol === "blob:"; + const isFile = protocol === "file:"; + if (!isBlob && !isFile && schemas.includes(protocol)) + return match; + return match.replace(protocol + "//", `https://pw-${protocol.slice(0, -1)}--`); + }); +} +function escapeURLsInStyleSheet(text2) { + const replacer = (match, url3) => { + if (url3.includes(" frame.frameSwapWallTime, wallTime) : findClosest(this._screencastFrames, (frame) => frame.timestamp, timestamp); + return closestFrame?.sha1; + } + render() { + const result2 = []; + const visit = (n, snapshotIndex, parentTag, parentAttrs) => { + if (typeof n === "string") { + if (parentTag === "STYLE" || parentTag === "style") + result2.push(escapeURLsInStyleSheet(rewriteURLsInStyleSheetForCustomProtocol(n))); + else + result2.push(escapeHTML(n)); + return; + } + if (isSubtreeReferenceSnapshot(n)) { + const referenceIndex = snapshotIndex - n[0][0]; + if (referenceIndex >= 0 && referenceIndex <= snapshotIndex) { + const nodes = snapshotNodes(this._snapshots[referenceIndex]); + const nodeIndex = n[0][1]; + if (nodeIndex >= 0 && nodeIndex < nodes.length) + return visit(nodes[nodeIndex], referenceIndex, parentTag, parentAttrs); + } + } else if (isNodeNameAttributesChildNodesSnapshot(n)) { + const [name, nodeAttrs, ...children] = n; + if (name.toUpperCase() === "SCRIPT") + return; + const upperName = name.toUpperCase(); + const nodeName = upperName === "NOSCRIPT" ? "X-NOSCRIPT" : name; + const attrs = Object.entries(nodeAttrs || {}); + result2.push("<", nodeName); + const kCurrentSrcAttribute = "__playwright_current_src__"; + const isFrame = upperName === "IFRAME" || upperName === "FRAME"; + const isAnchor = upperName === "A"; + const isImg = upperName === "IMG"; + const isMeta = upperName === "META"; + const isImgWithCurrentSrc = isImg && attrs.some((a) => a[0] === kCurrentSrcAttribute); + const isSourceInsidePictureWithCurrentSrc = upperName === "SOURCE" && parentTag === "PICTURE" && parentAttrs?.some((a) => a[0] === kCurrentSrcAttribute); + const hasUnsafeHttpEquiv = isMeta && attrs.some((a) => a[0].toLowerCase() === "http-equiv" && !kAllowedMetaHttpEquivs.has(a[1].trim().toLowerCase())); + for (const [attr, value2] of attrs) { + let attrName = attr; + if (attr.toLowerCase().startsWith("on")) + continue; + if (isFrame && attr.toLowerCase() === "src") { + attrName = "__playwright_src__"; + } + if (isFrame && (attr.toLowerCase() === "srcdoc" || attr.toLowerCase() === "sandbox")) { + attrName = "__playwright_" + attr.toLowerCase() + "__"; + } + if (upperName === "OBJECT" && attr.toLowerCase() === "data") + attrName = "__playwright_data__"; + if (upperName === "EMBED" && attr.toLowerCase() === "src") + attrName = "__playwright_src__"; + if (isImg && attr === kCurrentSrcAttribute) { + attrName = "src"; + } + if (["src", "srcset"].includes(attr.toLowerCase()) && (isImgWithCurrentSrc || isSourceInsidePictureWithCurrentSrc)) { + attrName = "_" + attrName; + } + if (hasUnsafeHttpEquiv && (attr.toLowerCase() === "http-equiv" || attr.toLowerCase() === "content")) { + attrName = "_" + attr; + } + let attrValue = value2; + if (!isAnchor && (attr.toLowerCase() === "href" || attr.toLowerCase() === "src" || attr === kCurrentSrcAttribute)) + attrValue = rewriteURLForCustomProtocol(value2); + result2.push(" ", attrName, '="', escapeHTMLAttribute(attrValue), '"'); + } + result2.push(">"); + for (const child of children) + visit(child, snapshotIndex, nodeName, attrs); + if (!autoClosing.has(nodeName)) + result2.push(""); + return; + } else { + return; + } + }; + const snapshot3 = this._snapshot; + const html = this._htmlCache.getOrCompute(this, () => { + visit(snapshot3.html, this._index, void 0, void 0); + const safeDoctype = snapshot3.doctype?.replace(/[^a-zA-Z0-9]/g, ""); + const prefix = safeDoctype ? `` : ""; + const html2 = prefix + [ + // Hide the document in order to prevent flickering. We will unhide once script has processed shadow. + "", + `` + ].join("") + result2.join(""); + return { value: html2, size: html2.length }; + }); + return { html, pageId: snapshot3.pageId, frameId: snapshot3.frameId, index: this._index }; + } + resourceByUrl(url3, method) { + const snapshot3 = this._snapshot; + let sameFrameResource; + let otherFrameResource; + for (const resource of this._resources) { + if (typeof resource._monotonicTime === "number" && resource._monotonicTime >= snapshot3.timestamp) + break; + if (resource.response.status === 304) { + continue; + } + if (resource.request.url === url3 && resource.request.method === method) { + if (resource._frameref === snapshot3.frameId) + sameFrameResource = resource; + else + otherFrameResource = resource; + } + } + let result2 = sameFrameResource ?? otherFrameResource; + if (result2 && method.toUpperCase() === "GET") { + let override = snapshot3.resourceOverrides.find((o) => o.url === url3); + if (override?.ref) { + const index = this._index - override.ref; + if (index >= 0 && index < this._snapshots.length) + override = this._snapshots[index].resourceOverrides.find((o) => o.url === url3); + } + if (override?.sha1) { + result2 = { + ...result2, + response: { + ...result2.response, + content: { + ...result2.response.content, + _sha1: override.sha1 + } + } + }; + } + } + return result2; + } + }; + autoClosing = /* @__PURE__ */ new Set(["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "MENUITEM", "META", "PARAM", "SOURCE", "TRACK", "WBR"]); + kAllowedMetaHttpEquivs = /* @__PURE__ */ new Set(["content-type", "content-language", "default-style", "x-ua-compatible"]); + schemas = ["about:", "blob:", "data:", "file:", "ftp:", "http:", "https:", "mailto:", "sftp:", "ws:", "wss:"]; + kLegacyBlobPrefix = "http://playwright.bloburl/#"; + urlInCSSRegex = /url\(['"]?([\w-]+:)\/\//ig; + urlToEscapeRegex1 = /url\(\s*'([^']*)'\s*\)/ig; + urlToEscapeRegex2 = /url\(\s*"([^"]*)"\s*\)/ig; + blankSnapshotUrl = "data:text/html;base64," + btoa(``); + } +}); + +// packages/isomorphic/lruCache.ts +var LRUCache; +var init_lruCache = __esm({ + "packages/isomorphic/lruCache.ts"() { + "use strict"; + LRUCache = class { + constructor(maxSize) { + this._maxSize = maxSize; + this._map = /* @__PURE__ */ new Map(); + this._size = 0; + } + getOrCompute(key, compute) { + if (this._map.has(key)) { + const result3 = this._map.get(key); + this._map.delete(key); + this._map.set(key, result3); + return result3.value; + } + const result2 = compute(); + while (this._map.size && this._size + result2.size > this._maxSize) { + const [firstKey, firstValue] = this._map.entries().next().value; + this._size -= firstValue.size; + this._map.delete(firstKey); + } + this._map.set(key, result2); + this._size += result2.size; + return result2.value; + } + }; + } +}); + +// packages/isomorphic/trace/snapshotStorage.ts +var SnapshotStorage; +var init_snapshotStorage = __esm({ + "packages/isomorphic/trace/snapshotStorage.ts"() { + "use strict"; + init_snapshotRenderer(); + init_lruCache(); + SnapshotStorage = class { + constructor() { + this._frameSnapshots = /* @__PURE__ */ new Map(); + this._cache = new LRUCache(1e8); + // 100MB per each trace + this._contextToResources = /* @__PURE__ */ new Map(); + this._resourceUrlsWithOverrides = /* @__PURE__ */ new Set(); + } + addResource(contextId4, resource) { + resource.request.url = rewriteURLForCustomProtocol(resource.request.url); + this._ensureResourcesForContext(contextId4).push(resource); + } + addFrameSnapshot(contextId4, snapshot3, screencastFrames) { + for (const override of snapshot3.resourceOverrides) + override.url = rewriteURLForCustomProtocol(override.url); + let frameSnapshots = this._frameSnapshots.get(snapshot3.frameId); + if (!frameSnapshots) { + frameSnapshots = { + raw: [], + renderers: [] + }; + this._frameSnapshots.set(snapshot3.frameId, frameSnapshots); + if (snapshot3.isMainFrame) + this._frameSnapshots.set(snapshot3.pageId, frameSnapshots); + } + frameSnapshots.raw.push(snapshot3); + const resources = this._ensureResourcesForContext(contextId4); + const renderer = new SnapshotRenderer(this._cache, resources, frameSnapshots.raw, screencastFrames, frameSnapshots.raw.length - 1); + frameSnapshots.renderers.push(renderer); + return renderer; + } + snapshotByName(pageOrFrameId, snapshotName) { + const snapshot3 = this._frameSnapshots.get(pageOrFrameId); + return snapshot3?.renderers.find((r) => r.snapshotName === snapshotName); + } + snapshotsForTest() { + return [...this._frameSnapshots.keys()]; + } + finalize() { + for (const resources of this._contextToResources.values()) + resources.sort((a, b) => (a._monotonicTime || 0) - (b._monotonicTime || 0)); + for (const frameSnapshots of this._frameSnapshots.values()) { + for (const snapshot3 of frameSnapshots.raw) { + for (const override of snapshot3.resourceOverrides) + this._resourceUrlsWithOverrides.add(override.url); + } + } + } + hasResourceOverride(url3) { + return this._resourceUrlsWithOverrides.has(url3); + } + _ensureResourcesForContext(contextId4) { + let resources = this._contextToResources.get(contextId4); + if (!resources) { + resources = []; + this._contextToResources.set(contextId4, resources); + } + return resources; + } + }; + } +}); + +// packages/isomorphic/trace/traceUtils.ts +function parseClientSideCallMetadata(data) { + const result2 = /* @__PURE__ */ new Map(); + const { files, stacks } = data; + for (const s of stacks) { + const [id, ff] = s; + result2.set(`call@${id}`, ff.map((f) => ({ file: files[f[0]], line: f[1], column: f[2], function: f[3] }))); + } + return result2; +} +function serializeClientSideCallMetadata(metadatas) { + const fileNames = /* @__PURE__ */ new Map(); + const stacks = []; + for (const m of metadatas) { + if (!m.stack || !m.stack.length) + continue; + const stack = []; + for (const frame of m.stack) { + let ordinal = fileNames.get(frame.file); + if (typeof ordinal !== "number") { + ordinal = fileNames.size; + fileNames.set(frame.file, ordinal); + } + const stackFrame = [ordinal, frame.line || 0, frame.column || 0, frame.function || ""]; + stack.push(stackFrame); + } + stacks.push([m.id, stack]); + } + return { files: [...fileNames.keys()], stacks }; +} +var init_traceUtils = __esm({ + "packages/isomorphic/trace/traceUtils.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/trace/traceModernizer.ts +var TraceVersionError, latestVersion, TraceModernizer; +var init_traceModernizer = __esm({ + "packages/isomorphic/trace/traceModernizer.ts"() { + "use strict"; + TraceVersionError = class extends Error { + constructor(message) { + super(message); + this.name = "TraceVersionError"; + } + }; + latestVersion = 8; + TraceModernizer = class { + constructor(contextEntry, snapshotStorage) { + this._actionMap = /* @__PURE__ */ new Map(); + this._pageEntries = /* @__PURE__ */ new Map(); + this._jsHandles = /* @__PURE__ */ new Map(); + this._consoleObjects = /* @__PURE__ */ new Map(); + this._contextEntry = contextEntry; + this._snapshotStorage = snapshotStorage; + } + appendTrace(trace) { + for (const line of trace.split("\n")) + this._appendEvent(line); + } + actions() { + return [...this._actionMap.values()]; + } + _pageEntry(pageId4) { + let pageEntry = this._pageEntries.get(pageId4); + if (!pageEntry) { + pageEntry = { + pageId: pageId4, + screencastFrames: [] + }; + this._pageEntries.set(pageId4, pageEntry); + this._contextEntry.pages.push(pageEntry); + } + return pageEntry; + } + _appendEvent(line) { + if (!line) + return; + const events = this._modernize(JSON.parse(line)); + for (const event of events) + this._innerAppendEvent(event); + } + _innerAppendEvent(event) { + const contextEntry = this._contextEntry; + switch (event.type) { + case "context-options": { + if (event.version > latestVersion) + throw new TraceVersionError("The trace was created by a newer version of Playwright and is not supported by this version of the viewer. Please use latest Playwright to open the trace."); + this._version = event.version; + contextEntry.origin = event.origin; + contextEntry.browserName = event.browserName; + contextEntry.channel = event.channel; + contextEntry.title = event.title; + contextEntry.platform = event.platform; + contextEntry.playwrightVersion = event.playwrightVersion; + contextEntry.wallTime = event.wallTime; + contextEntry.startTime = event.monotonicTime; + contextEntry.sdkLanguage = event.sdkLanguage; + contextEntry.options = event.options; + contextEntry.testIdAttributeName = event.testIdAttributeName; + contextEntry.contextId = event.contextId ?? ""; + contextEntry.testTimeout = event.testTimeout; + break; + } + case "screencast-frame": { + this._pageEntry(event.pageId).screencastFrames.push(event); + break; + } + case "before": { + this._actionMap.set(event.callId, { ...event, type: "action", endTime: 0, log: [] }); + break; + } + case "input": { + const existing = this._actionMap.get(event.callId); + existing.inputSnapshot = event.inputSnapshot; + existing.point = event.point; + break; + } + case "log": { + const existing = this._actionMap.get(event.callId); + if (!existing) + return; + existing.log.push({ + time: event.time, + message: event.message + }); + break; + } + case "after": { + const existing = this._actionMap.get(event.callId); + existing.afterSnapshot = event.afterSnapshot; + existing.endTime = event.endTime; + existing.result = event.result; + existing.error = event.error; + existing.attachments = event.attachments; + existing.annotations = event.annotations; + if (event.point) + existing.point = event.point; + break; + } + case "action": { + this._actionMap.set(event.callId, { ...event, log: [] }); + break; + } + case "event": { + contextEntry.events.push(event); + break; + } + case "stdout": { + contextEntry.stdio.push(event); + break; + } + case "stderr": { + contextEntry.stdio.push(event); + break; + } + case "error": { + contextEntry.errors.push(event); + break; + } + case "console": { + contextEntry.events.push(event); + break; + } + case "resource-snapshot": + this._snapshotStorage.addResource(this._contextEntry.contextId, event.snapshot); + contextEntry.resources.push(event.snapshot); + break; + case "frame-snapshot": + this._snapshotStorage.addFrameSnapshot(this._contextEntry.contextId, event.snapshot, this._pageEntry(event.snapshot.pageId).screencastFrames); + break; + } + if ("pageId" in event && event.pageId) + this._pageEntry(event.pageId); + if (event.type === "action" || event.type === "before") + contextEntry.startTime = Math.min(contextEntry.startTime, event.startTime); + if (event.type === "action" || event.type === "after") + contextEntry.endTime = Math.max(contextEntry.endTime, event.endTime); + if (event.type === "event") { + contextEntry.startTime = Math.min(contextEntry.startTime, event.time); + contextEntry.endTime = Math.max(contextEntry.endTime, event.time); + } + if (event.type === "screencast-frame") { + contextEntry.startTime = Math.min(contextEntry.startTime, event.timestamp); + contextEntry.endTime = Math.max(contextEntry.endTime, event.timestamp); + } + } + _processedContextCreatedEvent() { + return this._version !== void 0; + } + _modernize(event) { + let version3 = this._version ?? event.version ?? 6; + let events = [event]; + for (; version3 < latestVersion; ++version3) + events = this[`_modernize_${version3}_to_${version3 + 1}`].call(this, events); + return events; + } + _modernize_0_to_1(events) { + for (const event of events) { + if (event.type !== "action") + continue; + if (typeof event.metadata.error === "string") + event.metadata.error = { error: { name: "Error", message: event.metadata.error } }; + } + return events; + } + _modernize_1_to_2(events) { + for (const event of events) { + if (event.type !== "frame-snapshot" || !event.snapshot.isMainFrame) + continue; + event.snapshot.viewport = this._contextEntry.options?.viewport || { width: 1280, height: 720 }; + } + return events; + } + _modernize_2_to_3(events) { + for (const event of events) { + if (event.type !== "resource-snapshot" || event.snapshot.request) + continue; + const resource = event.snapshot; + event.snapshot = { + _frameref: resource.frameId, + request: { + url: resource.url, + method: resource.method, + headers: resource.requestHeaders, + postData: resource.requestSha1 ? { _sha1: resource.requestSha1 } : void 0 + }, + response: { + status: resource.status, + headers: resource.responseHeaders, + content: { + mimeType: resource.contentType, + _sha1: resource.responseSha1 + } + }, + _monotonicTime: resource.timestamp + }; + } + return events; + } + _modernize_3_to_4(events) { + const result2 = []; + for (const event of events) { + const e = this._modernize_event_3_to_4(event); + if (e) + result2.push(e); + } + return result2; + } + _modernize_event_3_to_4(event) { + if (event.type !== "action" && event.type !== "event") { + return event; + } + const metadata = event.metadata; + if (metadata.internal || metadata.method.startsWith("tracing")) + return null; + if (event.type === "event") { + if (metadata.method === "__create__" && metadata.type === "ConsoleMessage") { + return { + type: "object", + class: metadata.type, + guid: metadata.params.guid, + initializer: metadata.params.initializer + }; + } + return { + type: "event", + time: metadata.startTime, + class: metadata.type, + method: metadata.method, + params: metadata.params, + pageId: metadata.pageId + }; + } + return { + type: "action", + callId: metadata.id, + startTime: metadata.startTime, + endTime: metadata.endTime, + apiName: metadata.apiName || metadata.type + "." + metadata.method, + class: metadata.type, + method: metadata.method, + params: metadata.params, + // eslint-disable-next-line no-restricted-globals + wallTime: metadata.wallTime || Date.now(), + log: metadata.log, + beforeSnapshot: metadata.snapshots.find((s) => s.title === "before")?.snapshotName, + inputSnapshot: metadata.snapshots.find((s) => s.title === "input")?.snapshotName, + afterSnapshot: metadata.snapshots.find((s) => s.title === "after")?.snapshotName, + error: metadata.error?.error, + result: metadata.result, + point: metadata.point, + pageId: metadata.pageId + }; + } + _modernize_4_to_5(events) { + const result2 = []; + for (const event of events) { + const e = this._modernize_event_4_to_5(event); + if (e) + result2.push(e); + } + return result2; + } + _modernize_event_4_to_5(event) { + if (event.type === "event" && event.method === "__create__" && event.class === "JSHandle") + this._jsHandles.set(event.params.guid, event.params.initializer); + if (event.type === "object") { + if (event.class !== "ConsoleMessage") + return null; + const args = event.initializer.args?.map((arg) => { + if (arg.guid) { + const handle = this._jsHandles.get(arg.guid); + return { preview: handle?.preview || "", value: "" }; + } + return { preview: arg.preview || "", value: arg.value || "" }; + }); + this._consoleObjects.set(event.guid, { + type: event.initializer.type, + text: event.initializer.text, + location: event.initializer.location, + args + }); + return null; + } + if (event.type === "event" && event.method === "console") { + const consoleMessage = this._consoleObjects.get(event.params.message?.guid || ""); + if (!consoleMessage) + return null; + return { + type: "console", + time: event.time, + pageId: event.pageId, + messageType: consoleMessage.type, + text: consoleMessage.text, + args: consoleMessage.args, + location: consoleMessage.location + }; + } + return event; + } + _modernize_5_to_6(events) { + const result2 = []; + for (const event of events) { + result2.push(event); + if (event.type !== "after" || !event.log.length) + continue; + for (const log2 of event.log) { + result2.push({ + type: "log", + callId: event.callId, + message: log2, + time: -1 + }); + } + } + return result2; + } + _modernize_6_to_7(events) { + const result2 = []; + if (!this._processedContextCreatedEvent() && events[0].type !== "context-options") { + const event = { + type: "context-options", + origin: "testRunner", + version: 6, + browserName: "", + options: {}, + platform: "unknown", + wallTime: 0, + monotonicTime: 0, + sdkLanguage: "javascript", + contextId: "" + }; + result2.push(event); + } + for (const event of events) { + if (event.type === "context-options") { + result2.push({ ...event, monotonicTime: 0, origin: "library", contextId: "" }); + continue; + } + if (event.type === "before" || event.type === "action") { + if (!this._contextEntry.wallTime) + this._contextEntry.wallTime = event.wallTime; + const eventAsV6 = event; + const eventAsV7 = event; + eventAsV7.stepId = `${eventAsV6.apiName}@${eventAsV6.wallTime}`; + result2.push(eventAsV7); + } else { + result2.push(event); + } + } + return result2; + } + _modernize_7_to_8(events) { + const result2 = []; + for (const event of events) { + if (event.type === "before" || event.type === "action") { + const eventAsV7 = event; + const eventAsV8 = event; + if (eventAsV7.apiName) { + eventAsV8.title = eventAsV7.apiName; + delete eventAsV8.apiName; + } + eventAsV8.stepId = eventAsV7.stepId ?? eventAsV7.callId; + result2.push(eventAsV8); + } else { + result2.push(event); + } + } + return result2; + } + }; + } +}); + +// packages/isomorphic/trace/traceLoader.ts +function stripEncodingFromContentType(contentType) { + const charset = contentType.match(/^(.*);\s*charset=.*$/); + if (charset) + return charset[1]; + return contentType; +} +function createEmptyContext() { + return { + origin: "testRunner", + startTime: Number.MAX_SAFE_INTEGER, + wallTime: Number.MAX_SAFE_INTEGER, + endTime: 0, + browserName: "", + options: { + deviceScaleFactor: 1, + isMobile: false, + viewport: { width: 1280, height: 800 } + }, + pages: [], + resources: [], + actions: [], + events: [], + errors: [], + stdio: [], + hasSource: false, + contextId: "" + }; +} +var TraceLoader; +var init_traceLoader = __esm({ + "packages/isomorphic/trace/traceLoader.ts"() { + "use strict"; + init_traceUtils(); + init_snapshotStorage(); + init_traceModernizer(); + TraceLoader = class { + constructor() { + this.contextEntries = []; + this._resourceToContentType = /* @__PURE__ */ new Map(); + } + async load(backend, traceFile, unzipProgress) { + this._backend = backend; + const prefix = traceFile?.match(/(.+)\.trace$/)?.[1]; + const prefixes = []; + let hasSource = false; + for (const entryName of await this._backend.entryNames()) { + const match = entryName.match(/(.+)\.trace$/); + if (match && (!prefix || prefix === match[1])) + prefixes.push(match[1] || ""); + if (entryName.includes("src@")) + hasSource = true; + } + if (!prefixes.length) + throw new Error("Cannot find .trace file"); + this._snapshotStorage = new SnapshotStorage(); + const total = prefixes.length * 3; + let done = 0; + for (const prefix2 of prefixes) { + const contextEntry = createEmptyContext(); + contextEntry.hasSource = hasSource; + const modernizer = new TraceModernizer(contextEntry, this._snapshotStorage); + const trace = await this._backend.readText(prefix2 + ".trace") || ""; + modernizer.appendTrace(trace); + unzipProgress?.(++done, total); + const network = await this._backend.readText(prefix2 + ".network") || ""; + modernizer.appendTrace(network); + unzipProgress?.(++done, total); + contextEntry.actions = modernizer.actions().sort((a1, a2) => a1.startTime - a2.startTime); + if (!backend.isLive()) { + for (const action of contextEntry.actions.slice().reverse()) { + if (!action.endTime && !action.error) { + for (const a of contextEntry.actions) { + if (a.parentId === action.callId && action.endTime < a.endTime) + action.endTime = a.endTime; + } + } + } + } + const stacks = await this._backend.readText(prefix2 + ".stacks"); + if (stacks) { + const callMetadata = parseClientSideCallMetadata(JSON.parse(stacks)); + for (const action of contextEntry.actions) + action.stack = action.stack || callMetadata.get(action.callId); + } + unzipProgress?.(++done, total); + for (const resource of contextEntry.resources) { + if (resource.request.postData?._sha1) + this._resourceToContentType.set(resource.request.postData._sha1, stripEncodingFromContentType(resource.request.postData.mimeType)); + if (resource.response.content?._sha1) + this._resourceToContentType.set(resource.response.content._sha1, stripEncodingFromContentType(resource.response.content.mimeType)); + } + this.contextEntries.push(contextEntry); + } + this._snapshotStorage.finalize(); + } + async hasEntry(filename) { + return this._backend.hasEntry(filename); + } + async resourceForSha1(sha1) { + const blob = await this._backend.readBlob("resources/" + sha1); + const contentType = this._resourceToContentType.get(sha1); + if (!blob || contentType === void 0 || contentType === "x-unknown") + return blob; + return new Blob([blob], { type: contentType }); + } + storage() { + return this._snapshotStorage; + } + }; + } +}); + +// packages/isomorphic/trace/traceModel.ts +function indexModel(context2) { + for (const page of context2.pages) + page[contextSymbol] = context2; + for (let i = 0; i < context2.actions.length; ++i) { + const action = context2.actions[i]; + action[contextSymbol] = context2; + } + let lastNonRouteAction = void 0; + for (let i = context2.actions.length - 1; i >= 0; i--) { + const action = context2.actions[i]; + action[nextInContextSymbol] = lastNonRouteAction; + if (action.class !== "Route") + lastNonRouteAction = action; + } + for (const event of context2.events) + event[contextSymbol] = context2; + for (const resource of context2.resources) + resource[contextSymbol] = context2; +} +function mergeActionsAndUpdateTiming(contexts) { + const result2 = []; + const actions = mergeActionsAndUpdateTimingSameTrace(contexts); + result2.push(...actions); + result2.sort((a1, a2) => { + if (a2.parentId === a1.callId) + return 1; + if (a1.parentId === a2.callId) + return -1; + return a1.endTime - a2.endTime; + }); + for (let i = 1; i < result2.length; ++i) + result2[i][prevByEndTimeSymbol] = result2[i - 1]; + result2.sort((a1, a2) => { + if (a2.parentId === a1.callId) + return -1; + if (a1.parentId === a2.callId) + return 1; + return a1.startTime - a2.startTime; + }); + for (let i = 0; i + 1 < result2.length; ++i) + result2[i][nextByStartTimeSymbol] = result2[i + 1]; + return result2; +} +function mergeActionsAndUpdateTimingSameTrace(contexts) { + const map = /* @__PURE__ */ new Map(); + const libraryContexts = contexts.filter((context2) => context2.origin === "library"); + const testRunnerContexts = contexts.filter((context2) => context2.origin === "testRunner"); + if (!testRunnerContexts.length || !libraryContexts.length) { + return contexts.map((context2) => { + return context2.actions.map((action) => ({ ...action, context: context2 })); + }).flat(); + } + for (const context2 of libraryContexts) { + for (const action of context2.actions) { + map.set(action.stepId || `tmp-step@${++lastTmpStepId}`, { ...action, context: context2 }); + } + } + const delta = monotonicTimeDeltaBetweenLibraryAndRunner(testRunnerContexts, map); + if (delta) + adjustMonotonicTime(libraryContexts, delta); + const nonPrimaryIdToPrimaryId = /* @__PURE__ */ new Map(); + for (const context2 of testRunnerContexts) { + for (const action of context2.actions) { + const existing = action.stepId && map.get(action.stepId); + if (existing) { + nonPrimaryIdToPrimaryId.set(action.callId, existing.callId); + if (action.error) + existing.error = action.error; + if (action.attachments) + existing.attachments = action.attachments; + if (action.annotations) + existing.annotations = action.annotations; + if (action.parentId) + existing.parentId = nonPrimaryIdToPrimaryId.get(action.parentId) ?? action.parentId; + if (action.group) + existing.group = action.group; + existing.startTime = action.startTime; + existing.endTime = action.endTime; + continue; + } + if (action.parentId) + action.parentId = nonPrimaryIdToPrimaryId.get(action.parentId) ?? action.parentId; + map.set(action.stepId || `tmp-step@${++lastTmpStepId}`, { ...action, context: context2 }); + } + } + return [...map.values()]; +} +function adjustMonotonicTime(contexts, monotonicTimeDelta) { + for (const context2 of contexts) { + context2.startTime += monotonicTimeDelta; + context2.endTime += monotonicTimeDelta; + for (const action of context2.actions) { + if (action.startTime) + action.startTime += monotonicTimeDelta; + if (action.endTime) + action.endTime += monotonicTimeDelta; + } + for (const event of context2.events) + event.time += monotonicTimeDelta; + for (const event of context2.stdio) + event.timestamp += monotonicTimeDelta; + for (const page of context2.pages) { + for (const frame of page.screencastFrames) + frame.timestamp += monotonicTimeDelta; + } + for (const resource of context2.resources) { + if (resource._monotonicTime) + resource._monotonicTime += monotonicTimeDelta; + } + } +} +function monotonicTimeDeltaBetweenLibraryAndRunner(nonPrimaryContexts, libraryActions) { + for (const context2 of nonPrimaryContexts) { + for (const action of context2.actions) { + if (!action.startTime) + continue; + const libraryAction = action.stepId ? libraryActions.get(action.stepId) : void 0; + if (libraryAction) + return action.startTime - libraryAction.startTime; + } + } + return 0; +} +function buildActionTree(actions) { + const itemMap = /* @__PURE__ */ new Map(); + for (const action of actions) { + itemMap.set(action.callId, { + id: action.callId, + parent: void 0, + children: [], + action + }); + } + const rootItem = { action: { ...kFakeRootAction }, id: "", parent: void 0, children: [] }; + for (const item of itemMap.values()) { + rootItem.action.startTime = Math.min(rootItem.action.startTime, item.action.startTime); + rootItem.action.endTime = Math.max(rootItem.action.endTime, item.action.endTime); + const parent = item.action.parentId ? itemMap.get(item.action.parentId) || rootItem : rootItem; + parent.children.push(item); + item.parent = parent; + } + const inheritStack = (item) => { + for (const child of item.children) { + child.action.stack = child.action.stack ?? item.action.stack; + inheritStack(child); + } + }; + inheritStack(rootItem); + return { rootItem, itemMap }; +} +function context(action) { + return action[contextSymbol]; +} +function nextInContext(action) { + return action[nextInContextSymbol]; +} +function previousActionByEndTime(action) { + return action[prevByEndTimeSymbol]; +} +function nextActionByStartTime(action) { + return action[nextByStartTimeSymbol]; +} +function stats(action) { + let errors = 0; + let warnings = 0; + for (const event of eventsForAction(action)) { + if (event.type === "console") { + const type3 = event.messageType; + if (type3 === "warning") + ++warnings; + else if (type3 === "error") + ++errors; + } + if (event.type === "event" && event.method === "pageError") + ++errors; + } + return { errors, warnings }; +} +function eventsForAction(action) { + let result2 = action[eventsSymbol]; + if (result2) + return result2; + const nextAction = nextInContext(action); + result2 = context(action).events.filter((event) => { + return event.time >= action.startTime && (!nextAction || event.time < nextAction.startTime); + }); + action[eventsSymbol] = result2; + return result2; +} +function collectSources(actions, errorDescriptors) { + const result2 = /* @__PURE__ */ new Map(); + for (const action of actions) { + for (const frame of action.stack || []) { + let source12 = result2.get(frame.file); + if (!source12) { + source12 = { errors: [], content: void 0 }; + result2.set(frame.file, source12); + } + } + } + for (const error of errorDescriptors) { + const { action, stack, message } = error; + if (!action || !stack) + continue; + result2.get(stack[0].file)?.errors.push({ + line: stack[0].line || 0, + message + }); + } + return result2; +} +var contextSymbol, nextInContextSymbol, prevByEndTimeSymbol, nextByStartTimeSymbol, eventsSymbol, TraceModel, lastTmpStepId, kFakeRootAction; +var init_traceModel = __esm({ + "packages/isomorphic/trace/traceModel.ts"() { + "use strict"; + init_protocolFormatter(); + contextSymbol = /* @__PURE__ */ Symbol("context"); + nextInContextSymbol = /* @__PURE__ */ Symbol("nextInContext"); + prevByEndTimeSymbol = /* @__PURE__ */ Symbol("prevByEndTime"); + nextByStartTimeSymbol = /* @__PURE__ */ Symbol("nextByStartTime"); + eventsSymbol = /* @__PURE__ */ Symbol("events"); + TraceModel = class { + constructor(traceUri, contexts) { + this.pagerefToTitle = /* @__PURE__ */ new Map(); + this.contextToTitle = /* @__PURE__ */ new Map(); + contexts.forEach((contextEntry) => indexModel(contextEntry)); + const libraryContext = contexts.find((context2) => context2.origin === "library"); + this.traceUri = traceUri; + this.browserName = libraryContext?.browserName || ""; + this.sdkLanguage = libraryContext?.sdkLanguage; + this.channel = libraryContext?.channel; + this.testIdAttributeName = libraryContext?.testIdAttributeName; + this.platform = libraryContext?.platform || ""; + this.playwrightVersion = contexts.find((c) => c.playwrightVersion)?.playwrightVersion; + this.title = libraryContext?.title || ""; + this.options = libraryContext?.options || {}; + this.testTimeout = contexts.find((c) => c.origin === "testRunner")?.testTimeout; + this.actions = mergeActionsAndUpdateTiming(contexts); + this.pages = [].concat(...contexts.map((c) => c.pages)); + this.wallTime = contexts.map((c) => c.wallTime).reduce((prev, cur) => Math.min(prev || Number.MAX_VALUE, cur), Number.MAX_VALUE); + this.startTime = contexts.map((c) => c.startTime).reduce((prev, cur) => Math.min(prev, cur), Number.MAX_VALUE); + this.endTime = contexts.map((c) => c.endTime).reduce((prev, cur) => Math.max(prev, cur), Number.MIN_VALUE); + this.events = [].concat(...contexts.map((c) => c.events)); + this.stdio = [].concat(...contexts.map((c) => c.stdio)); + this.errors = [].concat(...contexts.map((c) => c.errors)); + this.hasSource = contexts.some((c) => c.hasSource); + this.hasStepData = contexts.some((context2) => context2.origin === "testRunner"); + this.resources = [...contexts.map((c) => c.resources)].flat().map((entry) => ({ ...entry, id: `${entry.pageref}-${entry.startedDateTime}-${entry.request.url}` })); + this.attachments = this.actions.flatMap((action) => action.attachments?.map((attachment) => ({ ...attachment, callId: action.callId, traceUri })) ?? []); + this.visibleAttachments = this.attachments.filter((attachment) => !attachment.name.startsWith("_")); + this.pages.forEach((page, index) => this.pagerefToTitle.set(page.pageId, "page#" + (index + 1))); + let lastApiContextId = 0; + let lastBrowserContextId = 0; + for (const context2 of contexts) { + if (context2.resources.some((resource) => resource._apiRequest)) + this.contextToTitle.set(context2, "api#" + ++lastApiContextId); + else + this.contextToTitle.set(context2, "browser#" + ++lastBrowserContextId); + } + this.events.sort((a1, a2) => a1.time - a2.time); + this.resources.sort((a1, a2) => a1._monotonicTime - a2._monotonicTime); + this.errorDescriptors = this.hasStepData ? this._errorDescriptorsFromTestRunner() : this._errorDescriptorsFromActions(); + this.sources = collectSources(this.actions, this.errorDescriptors); + this.actionCounters = /* @__PURE__ */ new Map(); + for (const action of this.actions) { + action.group = action.group ?? getActionGroup({ type: action.class, method: action.method }); + if (action.group) + this.actionCounters.set(action.group, 1 + (this.actionCounters.get(action.group) || 0)); + } + } + createRelativeUrl(path66) { + const url3 = new URL("http://localhost/" + path66); + url3.searchParams.set("trace", this.traceUri); + return url3.toString().substring("http://localhost/".length); + } + failedAction() { + return this.actions.findLast((a) => a.error); + } + filteredActions(actionsFilter) { + const filter = new Set(actionsFilter); + return this.actions.filter((action) => !action.group || filter.has(action.group)); + } + renderActionTree(filter) { + const actions = this.filteredActions(filter ?? []); + const { rootItem } = buildActionTree(actions); + const actionTree = []; + const visit = (actionItem, indent) => { + const title = renderTitleForCall({ ...actionItem.action, type: actionItem.action.class }); + actionTree.push(`${indent}${title || actionItem.id}`); + for (const child of actionItem.children) + visit(child, indent + " "); + }; + rootItem.children.forEach((a) => visit(a, "")); + return actionTree; + } + _errorDescriptorsFromActions() { + const errors = []; + for (const action of this.actions || []) { + if (!action.error?.message) + continue; + errors.push({ + action, + stack: action.stack, + message: action.error.message + }); + } + return errors; + } + _errorDescriptorsFromTestRunner() { + return this.errors.filter((e) => !!e.message).map((error, i) => ({ + stack: error.stack, + message: error.message + })); + } + }; + lastTmpStepId = 0; + kFakeRootAction = { + type: "action", + callId: "", + startTime: 0, + endTime: 0, + class: "", + method: "", + params: {}, + log: [], + context: { + origin: "library", + startTime: 0, + endTime: 0, + browserName: "", + wallTime: 0, + options: {}, + pages: [], + resources: [], + actions: [], + events: [], + stdio: [], + errors: [], + hasSource: false, + contextId: "" + } + }; + } +}); + +// packages/isomorphic/yaml.ts +function yamlEscapeKeyIfNeeded(str) { + if (!yamlStringNeedsQuotes(str)) + return str; + return `'` + str.replace(/'/g, `''`) + `'`; +} +function yamlEscapeValueIfNeeded(str) { + if (!yamlStringNeedsQuotes(str)) + return str; + return '"' + str.replace(/[\\"\x00-\x1f\x7f-\x9f]/g, (c) => { + switch (c) { + case "\\": + return "\\\\"; + case '"': + return '\\"'; + case "\b": + return "\\b"; + case "\f": + return "\\f"; + case "\n": + return "\\n"; + case "\r": + return "\\r"; + case " ": + return "\\t"; + default: + const code = c.charCodeAt(0); + return "\\x" + code.toString(16).padStart(2, "0"); + } + }) + '"'; +} +function yamlStringNeedsQuotes(str) { + if (str.length === 0) + return true; + if (/^\s|\s$/.test(str)) + return true; + if (/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/.test(str)) + return true; + if (/^-/.test(str)) + return true; + if (/[\n:](\s|$)/.test(str)) + return true; + if (/\s#/.test(str)) + return true; + if (/[\n\r]/.test(str)) + return true; + if (/^[&*\],?!>|@"'#%]/.test(str)) + return true; + if (/[{}`]/.test(str)) + return true; + if (/^\[/.test(str)) + return true; + if (!isNaN(Number(str)) || ["y", "n", "yes", "no", "true", "false", "on", "off", "null"].includes(str.toLowerCase())) + return true; + return false; +} +var init_yaml = __esm({ + "packages/isomorphic/yaml.ts"() { + "use strict"; + } +}); + +// packages/isomorphic/index.ts +var isomorphic_exports = {}; +__export(isomorphic_exports, { + CSharpLocatorFactory: () => CSharpLocatorFactory, + DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT: () => DEFAULT_PLAYWRIGHT_LAUNCH_TIMEOUT, + DEFAULT_PLAYWRIGHT_TIMEOUT: () => DEFAULT_PLAYWRIGHT_TIMEOUT, + InvalidSelectorError: () => InvalidSelectorError, + JavaLocatorFactory: () => JavaLocatorFactory, + JavaScriptLocatorFactory: () => JavaScriptLocatorFactory, + JsonlLocatorFactory: () => JsonlLocatorFactory, + KeyParser: () => KeyParser, + LongStandingScope: () => LongStandingScope, + ManualPromise: () => ManualPromise, + MultiMap: () => MultiMap, + ParserError: () => ParserError, + PythonLocatorFactory: () => PythonLocatorFactory, + Semaphore: () => Semaphore, + SnapshotServer: () => SnapshotServer, + SnapshotStorage: () => SnapshotStorage, + TraceLoader: () => TraceLoader, + TraceModel: () => TraceModel, + ansiRegex: () => ansiRegex, + asLocator: () => asLocator, + asLocatorDescription: () => asLocatorDescription, + asLocators: () => asLocators, + assert: () => assert, + base64ByteLength: () => base64ByteLength, + buildActionTree: () => buildActionTree, + bytesToString: () => bytesToString, + cacheNormalizedWhitespaces: () => cacheNormalizedWhitespaces, + constructURLBasedOnBaseURL: () => constructURLBasedOnBaseURL, + context: () => context, + customCSSNames: () => customCSSNames, + deserializeURLMatch: () => deserializeURLMatch, + escapeForAttributeSelector: () => escapeForAttributeSelector, + escapeForTextSelector: () => escapeForTextSelector, + escapeHTML: () => escapeHTML, + escapeHTMLAttribute: () => escapeHTMLAttribute, + escapeRegExp: () => escapeRegExp, + escapeTemplateString: () => escapeTemplateString, + escapeWithQuotes: () => escapeWithQuotes, + eventsForAction: () => eventsForAction, + findNewNode: () => findNewNode, + formatObject: () => formatObject, + formatObjectOrVoid: () => formatObjectOrVoid, + formatProtocolParam: () => formatProtocolParam, + getActionGroup: () => getActionGroup, + getExtensionForMimeType: () => getExtensionForMimeType, + getMetainfo: () => getMetainfo, + getMimeTypeForPath: () => getMimeTypeForPath, + globToRegexPattern: () => globToRegexPattern, + hasPointerCursor: () => hasPointerCursor, + headersArrayToObject: () => headersArrayToObject, + headersObjectToArray: () => headersObjectToArray, + isError: () => isError, + isHttpUrl: () => isHttpUrl, + isInvalidSelectorError: () => isInvalidSelectorError, + isJsonMimeType: () => isJsonMimeType, + isObject: () => isObject, + isRegExp: () => isRegExp2, + isRegexString: () => isRegexString, + isString: () => isString, + isTextualMimeType: () => isTextualMimeType, + isURLPattern: () => isURLPattern, + isXmlMimeType: () => isXmlMimeType, + locatorCustomDescription: () => locatorCustomDescription, + locatorOrSelectorAsSelector: () => locatorOrSelectorAsSelector, + longestCommonSubstring: () => longestCommonSubstring, + methodMetainfo: () => methodMetainfo, + monotonicTime: () => monotonicTime, + msToString: () => msToString, + nextActionByStartTime: () => nextActionByStartTime, + noColors: () => noColors, + normalizeEscapedRegexQuotes: () => normalizeEscapedRegexQuotes, + normalizeWhiteSpace: () => normalizeWhiteSpace, + padImageToSize: () => padImageToSize, + parseAriaSnapshot: () => parseAriaSnapshot, + parseAriaSnapshotUnsafe: () => parseAriaSnapshotUnsafe, + parseAttributeSelector: () => parseAttributeSelector, + parseCSS: () => parseCSS, + parseClientSideCallMetadata: () => parseClientSideCallMetadata, + parseRegex: () => parseRegex, + parseSelector: () => parseSelector, + pollAgainstDeadline: () => pollAgainstDeadline, + previousActionByEndTime: () => previousActionByEndTime, + quoteCSSAttributeValue: () => quoteCSSAttributeValue, + raceAgainstDeadline: () => raceAgainstDeadline, + renderTitleForCall: () => renderTitleForCall, + resolveGlobToRegexPattern: () => resolveGlobToRegexPattern, + scaleImageToSize: () => scaleImageToSize, + serializeClientSideCallMetadata: () => serializeClientSideCallMetadata, + serializeSelector: () => serializeSelector, + serializeURLMatch: () => serializeURLMatch, + serializeURLPattern: () => serializeURLPattern, + setTimeOrigin: () => setTimeOrigin, + signalToPromise: () => signalToPromise, + splitSelectorByFrame: () => splitSelectorByFrame, + stats: () => stats, + stringifySelector: () => stringifySelector, + stripAnsiEscapes: () => stripAnsiEscapes, + textValue: () => textValue, + timeOrigin: () => timeOrigin, + toSnakeCase: () => toSnakeCase, + toTitleCase: () => toTitleCase, + tomlArray: () => tomlArray, + tomlBasicString: () => tomlBasicString, + tomlMultilineBasicString: () => tomlMultilineBasicString, + trimString: () => trimString, + trimStringWithEllipsis: () => trimStringWithEllipsis, + truncateDataUrl: () => truncateDataUrl, + unsafeLocatorOrSelectorAsSelector: () => unsafeLocatorOrSelectorAsSelector, + urlMatches: () => urlMatches, + urlMatchesEqual: () => urlMatchesEqual, + validate: () => validate, + visitAllSelectorParts: () => visitAllSelectorParts, + webColors: () => webColors, + yamlEscapeKeyIfNeeded: () => yamlEscapeKeyIfNeeded, + yamlEscapeValueIfNeeded: () => yamlEscapeValueIfNeeded +}); +var init_isomorphic = __esm({ + "packages/isomorphic/index.ts"() { + "use strict"; + init_ariaSnapshot(); + init_assert(); + init_base64(); + init_colors(); + init_headers(); + init_imageUtils(); + init_jsonSchema(); + init_locatorGenerators(); + init_manualPromise(); + init_mimeType(); + init_multimap(); + init_protocolFormatter(); + init_protocolMetainfo(); + init_rtti(); + init_semaphore(); + init_stringUtils(); + init_formatUtils(); + init_time(); + init_timeoutRunner(); + init_snapshotServer(); + init_urlMatch(); + init_cssParser(); + init_locatorParser(); + init_selectorParser(); + init_snapshotStorage(); + init_traceLoader(); + init_traceModel(); + init_traceUtils(); + init_yaml(); + } +}); + +// packages/utils/ascii.ts +function wrapInASCIIBox(text2, padding = 0) { + const lines = text2.split("\n"); + const maxLength = Math.max(...lines.map((line) => line.length)); + return [ + "\u2554" + "\u2550".repeat(maxLength + padding * 2) + "\u2557", + ...lines.map((line) => "\u2551" + " ".repeat(padding) + line + " ".repeat(maxLength - line.length + padding) + "\u2551"), + "\u255A" + "\u2550".repeat(maxLength + padding * 2) + "\u255D" + ].join("\n"); +} +function jsonStringifyForceASCII(object) { + return JSON.stringify(object).replace( + /[\u007f-\uffff]/g, + (c) => "\\u" + ("0000" + c.charCodeAt(0).toString(16)).slice(-4) + ); +} +var init_ascii = __esm({ + "packages/utils/ascii.ts"() { + "use strict"; + } +}); + +// packages/utils/chromiumChannels.ts +function defaultUserDataDirForChannel(channel) { + return channelToDefaultUserDataDir.get(channel)?.[process.platform]; +} +function isChromiumChannelName(channel) { + return channelToDefaultUserDataDir.has(channel); +} +var import_os, import_path, channelToDefaultUserDataDir; +var init_chromiumChannels = __esm({ + "packages/utils/chromiumChannels.ts"() { + "use strict"; + import_os = __toESM(require("os")); + import_path = __toESM(require("path")); + channelToDefaultUserDataDir = /* @__PURE__ */ new Map([ + ["chrome", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome", "User Data") + }], + ["chrome-beta", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-beta"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Beta"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome Beta", "User Data") + }], + ["chrome-dev", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-unstable"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Dev"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome Dev", "User Data") + }], + ["chrome-canary", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "google-chrome-canary"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Google", "Chrome Canary"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Google", "Chrome SxS", "User Data") + }], + ["msedge", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge", "User Data") + }], + ["msedge-beta", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-beta"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Beta"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge Beta", "User Data") + }], + ["msedge-dev", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-dev"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Dev"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge Dev", "User Data") + }], + ["msedge-canary", { + "linux": import_path.default.join(import_os.default.homedir(), ".config", "microsoft-edge-canary"), + "darwin": import_path.default.join(import_os.default.homedir(), "Library", "Application Support", "Microsoft Edge Canary"), + "win32": import_path.default.join(process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local"), "Microsoft", "Edge SxS", "User Data") + }] + ]); + } +}); + +// packages/utils/third_party/pixelmatch.js +var require_pixelmatch = __commonJS({ + "packages/utils/third_party/pixelmatch.js"(exports2, module3) { + "use strict"; + module3.exports = pixelmatch2; + var defaultOptions = { + threshold: 0.1, + // matching threshold (0 to 1); smaller is more sensitive + includeAA: false, + // whether to skip anti-aliasing detection + alpha: 0.1, + // opacity of original image in diff output + aaColor: [255, 255, 0], + // color of anti-aliased pixels in diff output + diffColor: [255, 0, 0], + // color of different pixels in diff output + diffColorAlt: null, + // whether to detect dark on light differences between img1 and img2 and set an alternative color to differentiate between the two + diffMask: false + // draw the diff over a transparent background (a mask) + }; + function pixelmatch2(img1, img2, output, width, height, options) { + if (!isPixelData(img1) || !isPixelData(img2) || output && !isPixelData(output)) + throw new Error("Image data: Uint8Array, Uint8ClampedArray or Buffer expected."); + if (img1.length !== img2.length || output && output.length !== img1.length) + throw new Error("Image sizes do not match."); + if (img1.length !== width * height * 4) throw new Error("Image data size does not match width/height."); + options = Object.assign({}, defaultOptions, options); + const len = width * height; + const a32 = new Uint32Array(img1.buffer, img1.byteOffset, len); + const b32 = new Uint32Array(img2.buffer, img2.byteOffset, len); + let identical = true; + for (let i = 0; i < len; i++) { + if (a32[i] !== b32[i]) { + identical = false; + break; + } + } + if (identical) { + if (output && !options.diffMask) { + for (let i = 0; i < len; i++) drawGrayPixel(img1, 4 * i, options.alpha, output); + } + return 0; + } + const maxDelta = 35215 * options.threshold * options.threshold; + let diff2 = 0; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const pos = (y * width + x) * 4; + const delta = colorDelta(img1, img2, pos, pos); + if (Math.abs(delta) > maxDelta) { + if (!options.includeAA && (antialiased(img1, x, y, width, height, img2) || antialiased(img2, x, y, width, height, img1))) { + if (output && !options.diffMask) drawPixel2(output, pos, ...options.aaColor); + } else { + if (output) { + drawPixel2(output, pos, ...delta < 0 && options.diffColorAlt || options.diffColor); + } + diff2++; + } + } else if (output) { + if (!options.diffMask) drawGrayPixel(img1, pos, options.alpha, output); + } + } + } + return diff2; + } + function isPixelData(arr) { + return ArrayBuffer.isView(arr) && arr.constructor.BYTES_PER_ELEMENT === 1; + } + function antialiased(img, x1, y1, width, height, img2) { + const x0 = Math.max(x1 - 1, 0); + const y0 = Math.max(y1 - 1, 0); + const x2 = Math.min(x1 + 1, width - 1); + const y2 = Math.min(y1 + 1, height - 1); + const pos = (y1 * width + x1) * 4; + let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0; + let min = 0; + let max = 0; + let minX, minY, maxX, maxY; + for (let x = x0; x <= x2; x++) { + for (let y = y0; y <= y2; y++) { + if (x === x1 && y === y1) continue; + const delta = colorDelta(img, img, pos, (y * width + x) * 4, true); + if (delta === 0) { + zeroes++; + if (zeroes > 2) return false; + } else if (delta < min) { + min = delta; + minX = x; + minY = y; + } else if (delta > max) { + max = delta; + maxX = x; + maxY = y; + } + } + } + if (min === 0 || max === 0) return false; + return hasManySiblings(img, minX, minY, width, height) && hasManySiblings(img2, minX, minY, width, height) || hasManySiblings(img, maxX, maxY, width, height) && hasManySiblings(img2, maxX, maxY, width, height); + } + function hasManySiblings(img, x1, y1, width, height) { + const x0 = Math.max(x1 - 1, 0); + const y0 = Math.max(y1 - 1, 0); + const x2 = Math.min(x1 + 1, width - 1); + const y2 = Math.min(y1 + 1, height - 1); + const pos = (y1 * width + x1) * 4; + let zeroes = x1 === x0 || x1 === x2 || y1 === y0 || y1 === y2 ? 1 : 0; + for (let x = x0; x <= x2; x++) { + for (let y = y0; y <= y2; y++) { + if (x === x1 && y === y1) continue; + const pos2 = (y * width + x) * 4; + if (img[pos] === img[pos2] && img[pos + 1] === img[pos2 + 1] && img[pos + 2] === img[pos2 + 2] && img[pos + 3] === img[pos2 + 3]) zeroes++; + if (zeroes > 2) return true; + } + } + return false; + } + function colorDelta(img1, img2, k, m, yOnly) { + let r1 = img1[k + 0]; + let g1 = img1[k + 1]; + let b1 = img1[k + 2]; + let a1 = img1[k + 3]; + let r2 = img2[m + 0]; + let g2 = img2[m + 1]; + let b2 = img2[m + 2]; + let a2 = img2[m + 3]; + if (a1 === a2 && r1 === r2 && g1 === g2 && b1 === b2) return 0; + if (a1 < 255) { + a1 /= 255; + r1 = blend(r1, a1); + g1 = blend(g1, a1); + b1 = blend(b1, a1); + } + if (a2 < 255) { + a2 /= 255; + r2 = blend(r2, a2); + g2 = blend(g2, a2); + b2 = blend(b2, a2); + } + const y1 = rgb2y(r1, g1, b1); + const y2 = rgb2y(r2, g2, b2); + const y = y1 - y2; + if (yOnly) return y; + const i = rgb2i(r1, g1, b1) - rgb2i(r2, g2, b2); + const q = rgb2q(r1, g1, b1) - rgb2q(r2, g2, b2); + const delta = 0.5053 * y * y + 0.299 * i * i + 0.1957 * q * q; + return y1 > y2 ? -delta : delta; + } + function rgb2y(r, g, b) { + return r * 0.29889531 + g * 0.58662247 + b * 0.11448223; + } + function rgb2i(r, g, b) { + return r * 0.59597799 - g * 0.2741761 - b * 0.32180189; + } + function rgb2q(r, g, b) { + return r * 0.21147017 - g * 0.52261711 + b * 0.31114694; + } + function blend(c, a) { + return 255 + (c - 255) * a; + } + function drawPixel2(output, pos, r, g, b) { + output[pos + 0] = r; + output[pos + 1] = g; + output[pos + 2] = b; + output[pos + 3] = 255; + } + function drawGrayPixel(img, i, alpha, output) { + const r = img[i + 0]; + const g = img[i + 1]; + const b = img[i + 2]; + const val = blend(rgb2y(r, g, b), alpha * img[i + 3] / 255); + drawPixel2(output, i, val, val, val); + } + } +}); + +// packages/utils/image_tools/colorUtils.ts +function blendWithWhite(c, a) { + return 255 + (c - 255) * a; +} +function rgb2gray(r, g, b) { + return 77 * r + 150 * g + 29 * b + 128 >> 8; +} +function colorDeltaE94(rgb1, rgb2) { + const [l1, a1, b1] = xyz2lab(srgb2xyz(rgb1)); + const [l2, a2, b2] = xyz2lab(srgb2xyz(rgb2)); + const deltaL = l1 - l2; + const deltaA = a1 - a2; + const deltaB = b1 - b2; + const c1 = Math.sqrt(a1 ** 2 + b1 ** 2); + const c2 = Math.sqrt(a2 ** 2 + b2 ** 2); + const deltaC = c1 - c2; + let deltaH = deltaA ** 2 + deltaB ** 2 - deltaC ** 2; + deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH); + const k1 = 0.045; + const k2 = 0.015; + const kL = 1; + const kC = 1; + const kH = 1; + const sC = 1 + k1 * c1; + const sH = 1 + k2 * c1; + const sL = 1; + return Math.sqrt((deltaL / sL / kL) ** 2 + (deltaC / sC / kC) ** 2 + (deltaH / sH / kH) ** 2); +} +function srgb2xyz(rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; + r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; + g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92; + b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92; + return [ + r * 0.4124 + g * 0.3576 + b * 0.1805, + r * 0.2126 + g * 0.7152 + b * 0.0722, + r * 0.0193 + g * 0.1192 + b * 0.9505 + ]; +} +function xyz2lab(xyz) { + const x = xyz[0] / 0.950489; + const y = xyz[1]; + const z32 = xyz[2] / 1.08884; + const fx = x > sigma_pow3 ? x ** (1 / 3) : x / 3 / sigma_pow2 + 4 / 29; + const fy = y > sigma_pow3 ? y ** (1 / 3) : y / 3 / sigma_pow2 + 4 / 29; + const fz = z32 > sigma_pow3 ? z32 ** (1 / 3) : z32 / 3 / sigma_pow2 + 4 / 29; + const l = 116 * fy - 16; + const a = 500 * (fx - fy); + const b = 200 * (fy - fz); + return [l, a, b]; +} +var sigma_pow2, sigma_pow3; +var init_colorUtils = __esm({ + "packages/utils/image_tools/colorUtils.ts"() { + "use strict"; + sigma_pow2 = 6 * 6 / 29 / 29; + sigma_pow3 = 6 * 6 * 6 / 29 / 29 / 29; + } +}); + +// packages/utils/image_tools/imageChannel.ts +var ImageChannel; +var init_imageChannel = __esm({ + "packages/utils/image_tools/imageChannel.ts"() { + "use strict"; + init_colorUtils(); + ImageChannel = class _ImageChannel { + static intoRGB(width, height, data, options = {}) { + const { + paddingSize = 0, + paddingColorOdd = [255, 0, 255], + paddingColorEven = [0, 255, 0] + } = options; + const newWidth = width + 2 * paddingSize; + const newHeight = height + 2 * paddingSize; + const r = new Uint8Array(newWidth * newHeight); + const g = new Uint8Array(newWidth * newHeight); + const b = new Uint8Array(newWidth * newHeight); + for (let y = 0; y < newHeight; ++y) { + for (let x = 0; x < newWidth; ++x) { + const index = y * newWidth + x; + if (y >= paddingSize && y < newHeight - paddingSize && x >= paddingSize && x < newWidth - paddingSize) { + const offset = ((y - paddingSize) * width + (x - paddingSize)) * 4; + const alpha = data[offset + 3] === 255 ? 1 : data[offset + 3] / 255; + r[index] = blendWithWhite(data[offset], alpha); + g[index] = blendWithWhite(data[offset + 1], alpha); + b[index] = blendWithWhite(data[offset + 2], alpha); + } else { + const color = (y + x) % 2 === 0 ? paddingColorEven : paddingColorOdd; + r[index] = color[0]; + g[index] = color[1]; + b[index] = color[2]; + } + } + } + return [ + new _ImageChannel(newWidth, newHeight, r), + new _ImageChannel(newWidth, newHeight, g), + new _ImageChannel(newWidth, newHeight, b) + ]; + } + constructor(width, height, data) { + this.data = data; + this.width = width; + this.height = height; + } + get(x, y) { + return this.data[y * this.width + x]; + } + boundXY(x, y) { + return [ + Math.min(Math.max(x, 0), this.width - 1), + Math.min(Math.max(y, 0), this.height - 1) + ]; + } + }; + } +}); + +// packages/utils/image_tools/stats.ts +function ssim(stats2, x1, y1, x2, y2) { + const mean1 = stats2.meanC1(x1, y1, x2, y2); + const mean2 = stats2.meanC2(x1, y1, x2, y2); + const var1 = stats2.varianceC1(x1, y1, x2, y2); + const var2 = stats2.varianceC2(x1, y1, x2, y2); + const cov = stats2.covariance(x1, y1, x2, y2); + const c1 = (0.01 * DYNAMIC_RANGE) ** 2; + const c2 = (0.03 * DYNAMIC_RANGE) ** 2; + return (2 * mean1 * mean2 + c1) * (2 * cov + c2) / (mean1 ** 2 + mean2 ** 2 + c1) / (var1 + var2 + c2); +} +var DYNAMIC_RANGE, FastStats; +var init_stats = __esm({ + "packages/utils/image_tools/stats.ts"() { + "use strict"; + DYNAMIC_RANGE = 2 ** 8 - 1; + FastStats = class { + constructor(c1, c2) { + this.c1 = c1; + this.c2 = c2; + const { width, height } = c1; + this._partialSumC1 = new Array(width * height); + this._partialSumC2 = new Array(width * height); + this._partialSumSq1 = new Array(width * height); + this._partialSumSq2 = new Array(width * height); + this._partialSumMult = new Array(width * height); + const recalc = (mx, idx, initial, x, y) => { + mx[idx] = initial; + if (y > 0) + mx[idx] += mx[(y - 1) * width + x]; + if (x > 0) + mx[idx] += mx[y * width + x - 1]; + if (x > 0 && y > 0) + mx[idx] -= mx[(y - 1) * width + x - 1]; + }; + for (let y = 0; y < height; ++y) { + for (let x = 0; x < width; ++x) { + const idx = y * width + x; + recalc(this._partialSumC1, idx, this.c1.data[idx], x, y); + recalc(this._partialSumC2, idx, this.c2.data[idx], x, y); + recalc(this._partialSumSq1, idx, this.c1.data[idx] * this.c1.data[idx], x, y); + recalc(this._partialSumSq2, idx, this.c2.data[idx] * this.c2.data[idx], x, y); + recalc(this._partialSumMult, idx, this.c1.data[idx] * this.c2.data[idx], x, y); + } + } + } + _sum(partialSum, x1, y1, x2, y2) { + const width = this.c1.width; + let result2 = partialSum[y2 * width + x2]; + if (y1 > 0) + result2 -= partialSum[(y1 - 1) * width + x2]; + if (x1 > 0) + result2 -= partialSum[y2 * width + x1 - 1]; + if (x1 > 0 && y1 > 0) + result2 += partialSum[(y1 - 1) * width + x1 - 1]; + return result2; + } + meanC1(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return this._sum(this._partialSumC1, x1, y1, x2, y2) / N; + } + meanC2(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return this._sum(this._partialSumC2, x1, y1, x2, y2) / N; + } + varianceC1(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumSq1, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) ** 2 / N) / N; + } + varianceC2(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumSq2, x1, y1, x2, y2) - this._sum(this._partialSumC2, x1, y1, x2, y2) ** 2 / N) / N; + } + covariance(x1, y1, x2, y2) { + const N = (y2 - y1 + 1) * (x2 - x1 + 1); + return (this._sum(this._partialSumMult, x1, y1, x2, y2) - this._sum(this._partialSumC1, x1, y1, x2, y2) * this._sum(this._partialSumC2, x1, y1, x2, y2) / N) / N; + } + }; + } +}); + +// packages/utils/image_tools/compare.ts +function drawPixel(width, data, x, y, r, g, b) { + const idx = (y * width + x) * 4; + data[idx + 0] = r; + data[idx + 1] = g; + data[idx + 2] = b; + data[idx + 3] = 255; +} +function compare(actual, expected, diff2, width, height, options = {}) { + const { + maxColorDeltaE94 = 1 + } = options; + const paddingSize = Math.max(VARIANCE_WINDOW_RADIUS, SSIM_WINDOW_RADIUS); + const paddingColorEven = [255, 0, 255]; + const paddingColorOdd = [0, 255, 0]; + const [r1, g1, b1] = ImageChannel.intoRGB(width, height, expected, { + paddingSize, + paddingColorEven, + paddingColorOdd + }); + const [r2, g2, b2] = ImageChannel.intoRGB(width, height, actual, { + paddingSize, + paddingColorEven, + paddingColorOdd + }); + const noop = (x, y) => { + }; + const drawRedPixel = diff2 ? (x, y) => drawPixel(width, diff2, x - paddingSize, y - paddingSize, 255, 0, 0) : noop; + const drawYellowPixel = diff2 ? (x, y) => drawPixel(width, diff2, x - paddingSize, y - paddingSize, 255, 255, 0) : noop; + const drawGrayPixel = diff2 ? (x, y) => { + const gray = rgb2gray(r1.get(x, y), g1.get(x, y), b1.get(x, y)); + const value2 = blendWithWhite(gray, 0.1); + drawPixel(width, diff2, x - paddingSize, y - paddingSize, value2, value2, value2); + } : noop; + let fastR; + let fastG; + let fastB; + let diffCount = 0; + for (let y = paddingSize; y < r1.height - paddingSize; ++y) { + for (let x = paddingSize; x < r1.width - paddingSize; ++x) { + if (r1.get(x, y) === r2.get(x, y) && g1.get(x, y) === g2.get(x, y) && b1.get(x, y) === b2.get(x, y)) { + drawGrayPixel(x, y); + continue; + } + const delta = colorDeltaE94( + [r1.get(x, y), g1.get(x, y), b1.get(x, y)], + [r2.get(x, y), g2.get(x, y), b2.get(x, y)] + ); + if (delta <= maxColorDeltaE94) { + drawGrayPixel(x, y); + continue; + } + if (!fastR || !fastG || !fastB) { + fastR = new FastStats(r1, r2); + fastG = new FastStats(g1, g2); + fastB = new FastStats(b1, b2); + } + const [varX1, varY1] = r1.boundXY(x - VARIANCE_WINDOW_RADIUS, y - VARIANCE_WINDOW_RADIUS); + const [varX2, varY2] = r1.boundXY(x + VARIANCE_WINDOW_RADIUS, y + VARIANCE_WINDOW_RADIUS); + const var1 = fastR.varianceC1(varX1, varY1, varX2, varY2) + fastG.varianceC1(varX1, varY1, varX2, varY2) + fastB.varianceC1(varX1, varY1, varX2, varY2); + const var2 = fastR.varianceC2(varX1, varY1, varX2, varY2) + fastG.varianceC2(varX1, varY1, varX2, varY2) + fastB.varianceC2(varX1, varY1, varX2, varY2); + if (var1 === 0 || var2 === 0) { + drawRedPixel(x, y); + ++diffCount; + continue; + } + const [ssimX1, ssimY1] = r1.boundXY(x - SSIM_WINDOW_RADIUS, y - SSIM_WINDOW_RADIUS); + const [ssimX2, ssimY2] = r1.boundXY(x + SSIM_WINDOW_RADIUS, y + SSIM_WINDOW_RADIUS); + const ssimRGB = (ssim(fastR, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastG, ssimX1, ssimY1, ssimX2, ssimY2) + ssim(fastB, ssimX1, ssimY1, ssimX2, ssimY2)) / 3; + const isAntialiased = ssimRGB >= 0.99; + if (isAntialiased) { + drawYellowPixel(x, y); + } else { + drawRedPixel(x, y); + ++diffCount; + } + } + } + return diffCount; +} +var SSIM_WINDOW_RADIUS, VARIANCE_WINDOW_RADIUS; +var init_compare = __esm({ + "packages/utils/image_tools/compare.ts"() { + "use strict"; + init_colorUtils(); + init_imageChannel(); + init_stats(); + SSIM_WINDOW_RADIUS = 15; + VARIANCE_WINDOW_RADIUS = 1; + } +}); + +// packages/utils/webp/webp_codec.js +var require_webp_codec = __commonJS({ + "packages/utils/webp/webp_codec.js"(exports2, module3) { + "use strict"; + var Module = (() => { + var _scriptName = globalThis.document?.currentScript?.src; + return async function(moduleArg = {}) { + var Module2 = moduleArg; + var ENVIRONMENT_IS_WEB = !!globalThis.window; + var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; + var ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != "renderer"; + var programArgs = []; + var thisProgram = "./this.program"; + var quit_ = (status, toThrow) => { + throw toThrow; + }; + if (typeof __filename != "undefined") { + _scriptName = __filename; + } else { + } + var scriptDirectory = ""; + function locateFile(path66) { + if (Module2["locateFile"]) { + return Module2["locateFile"](path66, scriptDirectory); + } + return scriptDirectory + path66; + } + var readAsync, readBinary; + if (ENVIRONMENT_IS_NODE) { + var fs72 = require("node:fs"); + scriptDirectory = __dirname + "/"; + readBinary = (filename) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs72.readFileSync(filename); + return ret; + }; + readAsync = async (filename, binary = true) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs72.readFileSync(filename, binary ? void 0 : "utf8"); + return ret; + }; + if (process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, "/"); + } + programArgs = process.argv.slice(2); + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL(".", _scriptName).href; + } catch { + } + { + readAsync = async (url3) => { + var response2 = await fetch(url3, { credentials: "same-origin" }); + if (response2.ok) { + return response2.arrayBuffer(); + } + throw new Error(response2.status + " : " + response2.url); + }; + } + } else { + } + var out = console.log.bind(console); + var err = console.error.bind(console); + var wasmBinary; + var ABORT = false; + var EXITSTATUS; + var isFileURI = (filename) => filename.startsWith("file://"); + class EmscriptenEH { + } + class EmscriptenSjLj extends EmscriptenEH { + } + var runtimeInitialized = false; + function getMemoryBuffer() { + try { + var b = wasmMemory.toResizableBuffer(); + return b; + } catch { + } + return wasmMemory.buffer; + } + function updateMemoryViews() { + if (HEAP8?.buffer?.resizable) return; + var b = getMemoryBuffer(); + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + Module2["HEAPU8"] = HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + Module2["HEAPU32"] = HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + HEAPU64 = new BigUint64Array(b); + } + function preRun() { + var preRun2 = Module2["preRun"]; + if (preRun2) { + if (typeof preRun2 == "function") preRun2 = [preRun2]; + onPreRuns.push(...preRun2); + } + callRuntimeCallbacks(onPreRuns); + } + function initRuntime() { + runtimeInitialized = true; + wasmExports["g"](); + } + function postRun() { + var postRun2 = Module2["postRun"]; + if (postRun2) { + if (typeof postRun2 == "function") postRun2 = [postRun2]; + onPostRuns.push(...postRun2); + } + callRuntimeCallbacks(onPostRuns); + } + function abort(what) { + Module2["onAbort"]?.(what); + what = `Aborted(${what})`; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + throw e; + } + var wasmBinaryFile; + function findWasmBinary() { + return locateFile("webp_codec.wasm"); + } + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw 'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'; + } + function instantiateSync(file, info) { + var module4; + var binary = getBinarySync(file); + module4 = new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module4, info); + return [instance, module4]; + } + function getWasmImports() { + var imports = { a: wasmImports }; + return imports; + } + function createWasm() { + function receiveInstance(instance) { + wasmExports = instance.exports; + assignWasmExports(wasmExports); + updateMemoryViews(); + return wasmExports; + } + var info = getWasmImports(); + var instantiateWasm = Module2["instantiateWasm"]; + if (instantiateWasm) { + return new Promise((resolve) => { + instantiateWasm(info, (inst) => resolve(receiveInstance(inst))); + }); + } + wasmBinaryFile ??= findWasmBinary(); + var result2 = instantiateSync(wasmBinaryFile, info); + return receiveInstance(result2[0]); + } + class ExitStatus { + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var HEAP16; + var HEAP32; + var HEAP64; + var HEAP8; + var HEAPF32; + var HEAPF64; + var HEAPU16; + var HEAPU32; + var HEAPU64; + var HEAPU8; + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module2); + } + }; + var onPostRuns = []; + var onPreRuns = []; + var noExitRuntime = true; + var __abort_js = () => abort(""); + var runtimeKeepaliveCounter = 0; + var __emscripten_runtime_keepalive_clear = () => { + noExitRuntime = false; + runtimeKeepaliveCounter = 0; + }; + var timers = {}; + var handleException = (e) => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module2["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + var exitJS = (status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }; + var _exit = exitJS; + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = (func) => { + if (ABORT) { + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + var _emscripten_get_now = () => performance.now(); + var __setitimer_js = (which, timeout_ms) => { + if (timers[which]) { + clearTimeout(timers[which].id); + delete timers[which]; + } + if (!timeout_ms) return 0; + var id = setTimeout(() => { + delete timers[which]; + callUserCallback(() => __emscripten_timeout(which, _emscripten_get_now())); + }, timeout_ms); + timers[which] = { id, timeout_ms }; + return 0; + }; + var getHeapMax = () => 2147483648; + var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; + var growMemory = (size) => { + var oldHeapSize = wasmMemory.buffer.byteLength; + var pages = (size - oldHeapSize + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) { + } + }; + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }; + { + if (Module2["noExitRuntime"]) noExitRuntime = Module2["noExitRuntime"]; + if (Module2["print"]) out = Module2["print"]; + if (Module2["printErr"]) err = Module2["printErr"]; + if (Module2["wasmBinary"]) wasmBinary = Module2["wasmBinary"]; + if (Module2["arguments"]) programArgs = Module2["arguments"]; + if (Module2["thisProgram"]) thisProgram = Module2["thisProgram"]; + var preInit = Module2["preInit"]; + if (preInit) { + if (typeof preInit == "function") Module2["preInit"] = preInit = [preInit]; + while (preInit.length > 0) { + preInit.shift()(); + } + } + } + var _webp_encode_rgba, _webp_decode_rgba, _webp_free, _malloc, _free, __emscripten_timeout, memory, __indirect_function_table, wasmMemory; + function assignWasmExports(wasmExports2) { + _webp_encode_rgba = Module2["_webp_encode_rgba"] = wasmExports2["h"]; + _webp_decode_rgba = Module2["_webp_decode_rgba"] = wasmExports2["i"]; + _webp_free = Module2["_webp_free"] = wasmExports2["j"]; + _malloc = Module2["_malloc"] = wasmExports2["k"]; + _free = Module2["_free"] = wasmExports2["l"]; + __emscripten_timeout = wasmExports2["m"]; + memory = wasmMemory = wasmExports2["f"]; + __indirect_function_table = wasmExports2["__indirect_function_table"]; + } + var wasmImports = { e: __abort_js, d: __emscripten_runtime_keepalive_clear, a: __setitimer_js, b: _emscripten_resize_heap, c: _proc_exit }; + async function run() { + preRun(); + var setStatus = Module2["setStatus"]; + if (setStatus) { + setStatus("Running..."); + await new Promise((resolve) => setTimeout(resolve, 1)); + setTimeout(setStatus, 1, ""); + } + if (ABORT) return; + initRuntime(); + Module2["onRuntimeInitialized"]?.(); + postRun(); + } + var wasmExports; + wasmExports = createWasm(); + await run(); + ; + return Module2; + }; + })(); + if (typeof exports2 === "object" && typeof module3 === "object") { + module3.exports = Module; + module3.exports.default = Module; + } else if (typeof define === "function" && define["amd"]) define([], () => Module); + } +}); + +// packages/utils/webp/webp.ts +function webpModule() { + if (!module2) { + const instance = { wasmBinary: import_fs.default.readFileSync(import_path2.default.join(__dirname, "webp_codec.wasm")) }; + (0, import_webp_codec.default)(instance); + module2 = instance; + } + return module2; +} +function encodeWebp(image, options = {}) { + const { quality = 75, lossless = false } = options; + const m = webpModule(); + const inPtr = m._malloc(image.data.length); + m.HEAPU8.set(image.data, inPtr); + const sizePtr = m._malloc(4); + const outPtr = m._webp_encode_rgba(inPtr, image.width, image.height, quality, lossless ? 1 : 0, sizePtr); + const size = m.HEAPU32[sizePtr >> 2]; + let out; + if (outPtr && size) { + out = Buffer.from(m.HEAPU8.subarray(outPtr, outPtr + size)); + m._webp_free(outPtr); + } + m._free(inPtr); + m._free(sizePtr); + if (!out) + throw new Error("WebP encode failed"); + return out; +} +function decodeWebp(buffer) { + const m = webpModule(); + const inPtr = m._malloc(buffer.length); + m.HEAPU8.set(buffer, inPtr); + const widthPtr = m._malloc(4); + const heightPtr = m._malloc(4); + const outPtr = m._webp_decode_rgba(inPtr, buffer.length, widthPtr, heightPtr); + const width = m.HEAPU32[widthPtr >> 2]; + const height = m.HEAPU32[heightPtr >> 2]; + let result2; + if (outPtr) { + const data = Buffer.from(m.HEAPU8.subarray(outPtr, outPtr + width * height * 4)); + result2 = { data, width, height }; + m._webp_free(outPtr); + } + m._free(inPtr); + m._free(widthPtr); + m._free(heightPtr); + if (!result2) + throw new Error("WebP decode failed"); + return result2; +} +function isLosslessWebp(buffer) { + if (buffer.length < 16 || buffer.toString("ascii", 0, 4) !== "RIFF" || buffer.toString("ascii", 8, 12) !== "WEBP") + return false; + let offset = 12; + while (offset + 8 <= buffer.length) { + const fourcc = buffer.toString("ascii", offset, offset + 4); + if (fourcc === "VP8L") + return true; + if (fourcc === "VP8 ") + return false; + const size = buffer.readUInt32LE(offset + 4); + offset += 8 + size + (size & 1); + } + return false; +} +var import_fs, import_path2, import_webp_codec, module2; +var init_webp = __esm({ + "packages/utils/webp/webp.ts"() { + "use strict"; + import_fs = __toESM(require("fs")); + import_path2 = __toESM(require("path")); + import_webp_codec = __toESM(require_webp_codec()); + } +}); + +// packages/utils/comparators.ts +function getComparator(mimeType) { + if (mimeType === "image/png") + return compareImages.bind(null, "image/png"); + if (mimeType === "image/jpeg") + return compareImages.bind(null, "image/jpeg"); + if (mimeType === "image/webp") + return compareImages.bind(null, "image/webp"); + if (mimeType === "text/plain") + return compareText; + return compareBuffersOrStrings; +} +function compareBuffersOrStrings(actualBuffer, expectedBuffer) { + if (typeof actualBuffer === "string") + return compareText(actualBuffer, expectedBuffer); + if (!actualBuffer || !(actualBuffer instanceof Buffer)) + return { errorMessage: "Actual result should be a Buffer or a string." }; + if (Buffer.compare(actualBuffer, expectedBuffer)) + return { errorMessage: "Buffers differ" }; + return null; +} +function compareImages(mimeType, actualBuffer, expectedBuffer, options = {}) { + if (!actualBuffer || !(actualBuffer instanceof Buffer)) + return { errorMessage: "Actual result should be a Buffer." }; + validateBuffer(expectedBuffer, mimeType); + const decode = (buffer) => { + if (mimeType === "image/png") + return PNG.sync.read(buffer); + if (mimeType === "image/webp") + return decodeWebp(buffer); + return jpegjs.decode(buffer, { maxMemoryUsageInMB: JPEG_JS_MAX_BUFFER_SIZE_IN_MB }); + }; + let actual = decode(actualBuffer); + let expected = decode(expectedBuffer); + const size = { width: Math.max(expected.width, actual.width), height: Math.max(expected.height, actual.height) }; + let sizesMismatchError = ""; + if (expected.width !== actual.width || expected.height !== actual.height) { + sizesMismatchError = `Expected an image ${expected.width}px by ${expected.height}px, received ${actual.width}px by ${actual.height}px. `; + actual = padImageToSize(actual, size); + expected = padImageToSize(expected, size); + } + const diff2 = new PNG({ width: size.width, height: size.height }); + let count; + if (options.comparator === "ssim-cie94") { + count = compare(expected.data, actual.data, diff2.data, size.width, size.height, { + // All ΔE* formulae are originally designed to have the difference of 1.0 stand for a "just noticeable difference" (JND). + // See https://en.wikipedia.org/wiki/Color_difference#CIELAB_%CE%94E* + maxColorDeltaE94: 1 + }); + } else if ((options.comparator ?? "pixelmatch") === "pixelmatch") { + count = (0, import_pixelmatch.default)(expected.data, actual.data, diff2.data, size.width, size.height, { + threshold: options.threshold ?? 0.2 + }); + } else { + throw new Error(`Configuration specifies unknown comparator "${options.comparator}"`); + } + const maxDiffPixels1 = options.maxDiffPixels; + const maxDiffPixels2 = options.maxDiffPixelRatio !== void 0 ? expected.width * expected.height * options.maxDiffPixelRatio : void 0; + let maxDiffPixels; + if (maxDiffPixels1 !== void 0 && maxDiffPixels2 !== void 0) + maxDiffPixels = Math.min(maxDiffPixels1, maxDiffPixels2); + else + maxDiffPixels = maxDiffPixels1 ?? maxDiffPixels2 ?? 0; + const ratio = Math.ceil(count / (expected.width * expected.height) * 100) / 100; + const pixelsMismatchError = count > maxDiffPixels ? `${count} pixels (ratio ${ratio.toFixed(2)} of all image pixels) are different.` : ""; + if (pixelsMismatchError || sizesMismatchError) + return { errorMessage: sizesMismatchError + pixelsMismatchError, diff: PNG.sync.write(diff2) }; + return null; +} +function validateBuffer(buffer, mimeType) { + if (mimeType === "image/png") { + const pngMagicNumber = [137, 80, 78, 71, 13, 10, 26, 10]; + if (buffer.length < pngMagicNumber.length || !pngMagicNumber.every((byte, index) => buffer[index] === byte)) + throw new Error("Could not decode expected image as PNG."); + } else if (mimeType === "image/jpeg") { + const jpegMagicNumber = [255, 216]; + if (buffer.length < jpegMagicNumber.length || !jpegMagicNumber.every((byte, index) => buffer[index] === byte)) + throw new Error("Could not decode expected image as JPEG."); + } else if (mimeType === "image/webp") { + if (buffer.length < 12 || buffer.toString("ascii", 0, 4) !== "RIFF" || buffer.toString("ascii", 8, 12) !== "WEBP") + throw new Error("Could not decode expected image as WEBP."); + } +} +function compareText(actual, expectedBuffer) { + if (typeof actual !== "string") + return { errorMessage: "Actual result should be a string" }; + let expected = expectedBuffer.toString("utf-8"); + if (expected === actual) + return null; + if (!actual.endsWith("\n")) + actual += "\n"; + if (!expected.endsWith("\n")) + expected += "\n"; + const lines = diff.createPatch("file", expected, actual, void 0, void 0, { context: 5 }).split("\n"); + const coloredLines = lines.slice(4).map((line) => { + if (line.startsWith("-")) + return colors.green(line); + if (line.startsWith("+")) + return colors.red(line); + if (line.startsWith("@@")) + return colors.dim(line); + return line; + }); + const errorMessage = coloredLines.join("\n"); + return { errorMessage }; +} +var import_pixelmatch, jpegjs, colors, diff, PNG, JPEG_JS_MAX_BUFFER_SIZE_IN_MB; +var init_comparators = __esm({ + "packages/utils/comparators.ts"() { + "use strict"; + init_imageUtils(); + import_pixelmatch = __toESM(require_pixelmatch()); + init_compare(); + init_webp(); + jpegjs = require("./utilsBundle").jpegjs; + colors = require("./utilsBundle").colors; + diff = require("./utilsBundle").diff; + ({ PNG } = require("./utilsBundle")); + JPEG_JS_MAX_BUFFER_SIZE_IN_MB = 5 * 1024; + } +}); + +// packages/utils/crypto.ts +function createGuid() { + return import_crypto.default.randomBytes(16).toString("hex"); +} +function calculateSha1(buffer) { + const hash = import_crypto.default.createHash("sha1"); + hash.update(buffer); + return hash.digest("hex"); +} +function encodeBase128(value2) { + const bytes = []; + do { + let byte = value2 & 127; + value2 >>>= 7; + if (bytes.length > 0) + byte |= 128; + bytes.push(byte); + } while (value2 > 0); + return Buffer.from(bytes.reverse()); +} +function generateSelfSignedCertificate() { + const { privateKey, publicKey } = import_crypto.default.generateKeyPairSync("rsa", { modulusLength: 2048 }); + const publicKeyDer = publicKey.export({ type: "pkcs1", format: "der" }); + const oneYearInMilliseconds = 365 * 24 * 60 * 60 * 1e3; + const notBefore = new Date((/* @__PURE__ */ new Date()).getTime() - oneYearInMilliseconds); + const notAfter = new Date((/* @__PURE__ */ new Date()).getTime() + oneYearInMilliseconds); + const tbsCertificate = DER.encodeSequence([ + DER.encodeExplicitContextDependent(0, DER.encodeInteger(1)), + // version + DER.encodeInteger(1), + // serialNumber + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"), + // sha256WithRSAEncryption PKCS #1 + DER.encodeNull() + ]), + // signature + DER.encodeSequence([ + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.3"), + // commonName X.520 DN component + DER.encodePrintableString("localhost") + ]) + ]), + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.10"), + // organizationName X.520 DN component + DER.encodePrintableString("Playwright Client Certificate Support") + ]) + ]) + ]), + // issuer + DER.encodeSequence([ + DER.encodeDate(notBefore), + // notBefore + DER.encodeDate(notAfter) + // notAfter + ]), + // validity + DER.encodeSequence([ + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.3"), + // commonName X.520 DN component + DER.encodePrintableString("localhost") + ]) + ]), + DER.encodeSet([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("2.5.4.10"), + // organizationName X.520 DN component + DER.encodePrintableString("Playwright Client Certificate Support") + ]) + ]) + ]), + // subject + DER.encodeSequence([ + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.1"), + // rsaEncryption PKCS #1 + DER.encodeNull() + ]), + DER.encodeBitString(publicKeyDer) + ]) + // SubjectPublicKeyInfo + ]); + const signature = import_crypto.default.sign("sha256", tbsCertificate, privateKey); + const certificate = DER.encodeSequence([ + tbsCertificate, + DER.encodeSequence([ + DER.encodeObjectIdentifier("1.2.840.113549.1.1.11"), + // sha256WithRSAEncryption PKCS #1 + DER.encodeNull() + ]), + DER.encodeBitString(signature) + ]); + const certPem = [ + "-----BEGIN CERTIFICATE-----", + // Split the base64 string into lines of 64 characters + certificate.toString("base64").match(/.{1,64}/g).join("\n"), + "-----END CERTIFICATE-----" + ].join("\n"); + return { + cert: certPem, + key: privateKey.export({ type: "pkcs1", format: "pem" }) + }; +} +var import_crypto, DER; +var init_crypto = __esm({ + "packages/utils/crypto.ts"() { + "use strict"; + import_crypto = __toESM(require("crypto")); + init_assert(); + DER = class { + static encodeSequence(data) { + return this._encode(48, Buffer.concat(data)); + } + static encodeInteger(data) { + assert(data >= -128 && data <= 127); + return this._encode(2, Buffer.from([data])); + } + static encodeObjectIdentifier(oid) { + const parts = oid.split(".").map((v) => Number(v)); + const output = [encodeBase128(40 * parts[0] + parts[1])]; + for (let i = 2; i < parts.length; i++) + output.push(encodeBase128(parts[i])); + return this._encode(6, Buffer.concat(output)); + } + static encodeNull() { + return Buffer.from([5, 0]); + } + static encodeSet(data) { + assert(data.length === 1, "Only one item in the set is supported. We'd need to sort the data to support more."); + return this._encode(49, Buffer.concat(data)); + } + static encodeExplicitContextDependent(tag, data) { + return this._encode(160 + tag, data); + } + static encodePrintableString(data) { + return this._encode(19, Buffer.from(data)); + } + static encodeBitString(data) { + const unusedBits = 0; + const content = Buffer.concat([Buffer.from([unusedBits]), data]); + return this._encode(3, content); + } + static encodeDate(date) { + const year = date.getUTCFullYear(); + const isGeneralizedTime = year >= 2050; + const parts = [ + isGeneralizedTime ? year.toString() : year.toString().slice(-2), + (date.getUTCMonth() + 1).toString().padStart(2, "0"), + date.getUTCDate().toString().padStart(2, "0"), + date.getUTCHours().toString().padStart(2, "0"), + date.getUTCMinutes().toString().padStart(2, "0"), + date.getUTCSeconds().toString().padStart(2, "0") + ]; + const encodedDate = parts.join("") + "Z"; + const tag = isGeneralizedTime ? 24 : 23; + return this._encode(tag, Buffer.from(encodedDate)); + } + static _encode(tag, data) { + const lengthBytes = this._encodeLength(data.length); + return Buffer.concat([Buffer.from([tag]), lengthBytes, data]); + } + static _encodeLength(length) { + if (length < 128) { + return Buffer.from([length]); + } else { + const lengthBytes = []; + while (length > 0) { + lengthBytes.unshift(length & 255); + length >>= 8; + } + return Buffer.from([128 | lengthBytes.length, ...lengthBytes]); + } + } + }; + } +}); + +// packages/utils/env.ts +function getFromENV(name) { + let value2 = process.env[name]; + value2 = value2 === void 0 ? process.env[`npm_config_${name.toLowerCase()}`] : value2; + value2 = value2 === void 0 ? process.env[`npm_package_config_${name.toLowerCase()}`] : value2; + return value2; +} +function getAsBooleanFromENV(name, defaultValue) { + const value2 = getFromENV(name); + if (value2 === "false" || value2 === "0") + return false; + if (value2) + return true; + return !!defaultValue; +} +function getPackageManager() { + const env = process.env.npm_config_user_agent || ""; + if (env.includes("yarn")) + return "yarn"; + if (env.includes("pnpm")) + return "pnpm"; + return "npm"; +} +function getPackageManagerExecCommand() { + const packageManager = getPackageManager(); + if (packageManager === "yarn") + return "yarn"; + if (packageManager === "pnpm") + return "pnpm exec"; + return "npx"; +} +function isLikelyNpxGlobal() { + return process.argv.length >= 2 && process.argv[1].includes("_npx"); +} +function setPlaywrightTestProcessEnv() { + return process.env["PLAYWRIGHT_TEST"] = "1"; +} +function guessClientName() { + if (process.env.CLAUDECODE) + return "Claude Code"; + if (process.env.COPILOT_CLI) + return "GitHub Copilot"; + return "playwright-cli"; +} +function isCodingAgent() { + return !!process.env.CLAUDECODE || !!process.env.COPILOT_CLI; +} +var init_env = __esm({ + "packages/utils/env.ts"() { + "use strict"; + } +}); + +// packages/utils/debug.ts +function debugMode() { + if (_debugMode === "console") + return "console"; + if (_debugMode === "0" || _debugMode === "false") + return ""; + return _debugMode ? "inspector" : ""; +} +function isUnderTest() { + return _isUnderTest; +} +var _debugMode, _isUnderTest; +var init_debug = __esm({ + "packages/utils/debug.ts"() { + "use strict"; + init_env(); + _debugMode = getFromENV("PWDEBUG") || ""; + _isUnderTest = getAsBooleanFromENV("PWTEST_UNDER_TEST"); + } +}); + +// packages/utils/debugLogger.ts +var import_fs2, debug, debugLoggerColorMap, DebugLogger, debugLogger, kLogCount, RecentLogsCollector; +var init_debugLogger = __esm({ + "packages/utils/debugLogger.ts"() { + "use strict"; + import_fs2 = __toESM(require("fs")); + debug = require("./utilsBundle").debug; + debugLoggerColorMap = { + "api": 45, + // cyan + "protocol": 34, + // green + "install": 34, + // green + "download": 34, + // green + "browser": 0, + // reset + "socks": 92, + // purple + "client-certificates": 92, + // purple + "error": 160, + // red, + "channel": 33, + // blue + "server": 45, + // cyan + "server:channel": 34, + // green + "server:metadata": 33, + // blue, + "recorder": 45 + // cyan + }; + DebugLogger = class { + constructor() { + this._debuggers = /* @__PURE__ */ new Map(); + if (process.env.DEBUG_FILE) { + const ansiRegex2 = new RegExp([ + "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", + "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))" + ].join("|"), "g"); + const stream4 = import_fs2.default.createWriteStream(process.env.DEBUG_FILE); + debug.log = (data) => { + stream4.write(data.replace(ansiRegex2, "")); + stream4.write("\n"); + }; + } + } + log(name, message) { + let cachedDebugger = this._debuggers.get(name); + if (!cachedDebugger) { + cachedDebugger = debug(`pw:${name}`); + this._debuggers.set(name, cachedDebugger); + cachedDebugger.color = debugLoggerColorMap[name] || 0; + } + cachedDebugger(message); + } + isEnabled(name) { + return debug.enabled(`pw:${name}`); + } + }; + debugLogger = new DebugLogger(); + kLogCount = 150; + RecentLogsCollector = class { + constructor() { + this._logs = []; + this._listeners = []; + } + log(message) { + this._logs.push(message); + if (this._logs.length === kLogCount * 2) + this._logs.splice(0, kLogCount); + for (const listener of this._listeners) + listener(message); + } + recentLogs() { + if (this._logs.length > kLogCount) + return this._logs.slice(-kLogCount); + return this._logs; + } + onMessage(listener) { + for (const message of this._logs) + listener(message); + this._listeners.push(listener); + } + }; + } +}); + +// packages/utils/eventsHelper.ts +var EventsHelper, eventsHelper; +var init_eventsHelper = __esm({ + "packages/utils/eventsHelper.ts"() { + "use strict"; + EventsHelper = class { + static addEventListener(emitter, eventName, handler) { + emitter.on(eventName, handler); + return { emitter, eventName, handler, dispose: async () => { + emitter.removeListener(eventName, handler); + } }; + } + static removeEventListeners(listeners) { + for (const listener of listeners) + listener.emitter.removeListener(listener.eventName, listener.handler); + listeners.splice(0, listeners.length); + } + }; + eventsHelper = EventsHelper; + } +}); + +// packages/utils/fileUtils.ts +async function mkdirIfNeeded(filePath) { + await import_fs3.default.promises.mkdir(import_path3.default.dirname(filePath), { recursive: true }).catch(() => { + }); +} +async function removeFolders(dirs) { + return await Promise.all(dirs.map( + (dir) => import_fs3.default.promises.rm(dir, { recursive: true, force: true, maxRetries: 10 }).catch((e) => e) + )); +} +function canAccessFile(file) { + if (!file) + return false; + try { + import_fs3.default.accessSync(file); + return true; + } catch (e) { + return false; + } +} +function isWritable(file) { + try { + import_fs3.default.accessSync(file, import_fs3.default.constants.W_OK); + return true; + } catch { + return false; + } +} +function isSystemDirectory(dir) { + const resolved = import_path3.default.resolve(dir); + if (process.platform === "win32") { + const systemRoot = import_path3.default.resolve(process.env.SystemRoot || "C:\\Windows"); + return isPathInside(systemRoot.toLowerCase(), resolved.toLowerCase()); + } + return resolved === "/"; +} +async function copyFileAndMakeWritable(from, to) { + await import_fs3.default.promises.copyFile(from, to); + await import_fs3.default.promises.chmod(to, 436); +} +function addSuffixToFilePath(filePath, suffix) { + const ext = import_path3.default.extname(filePath); + const base = filePath.substring(0, filePath.length - ext.length); + return base + suffix + ext; +} +function sanitizeForFilePath(s) { + return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, "-"); +} +function trimLongString(s, length = 100) { + if (s.length <= length) + return s; + const hash = calculateSha1(s); + const middle = `-${hash.substring(0, 5)}-`; + const start3 = Math.floor((length - middle.length) / 2); + const end = length - middle.length - start3; + return s.substring(0, start3) + middle + s.slice(-end); +} +function isPathInside(root, candidate) { + const resolvedRoot = import_path3.default.resolve(root); + const resolvedCandidate = import_path3.default.resolve(candidate); + if (resolvedCandidate === resolvedRoot) + return true; + return resolvedCandidate.startsWith(resolvedRoot + import_path3.default.sep); +} +function resolveWithinRoot(root, fileName) { + if (import_path3.default.isAbsolute(fileName)) + return null; + const resolvedFile = import_path3.default.resolve(root, fileName); + return isPathInside(root, resolvedFile) ? resolvedFile : null; +} +function throwingResolveWithinRoot(root, fileName) { + const resolved = resolveWithinRoot(root, fileName); + if (!resolved) + throw new Error(`Path '${fileName}' escapes root directory`); + return resolved; +} +function toPosixPath(aPath) { + return aPath.split(import_path3.default.sep).join(import_path3.default.posix.sep); +} +function makeSocketPath(domain, name) { + const userNameHash = calculateSha1(process.env.USERNAME || process.env.USER || "default").slice(0, 8); + if (process.platform === "win32") { + const socketsDir = process.env.PWTEST_SOCKETS_DIR; + const suffix2 = socketsDir ? `-${calculateSha1(socketsDir).slice(0, 8)}` : ""; + return `\\\\.\\pipe\\pw-${userNameHash}-${domain}-${name}${suffix2}`; + } + const baseDir = process.env.PWTEST_SOCKETS_DIR || import_path3.default.join(import_os2.default.tmpdir(), `pw-${userNameHash}`); + const dir = import_path3.default.join(baseDir, domain); + const suffix = ".sock"; + const maxNameLength = UNIX_SOCKET_PATH_MAX - dir.length - import_path3.default.sep.length - suffix.length; + if (maxNameLength < 1) + throw new Error(`Socket directory path is too long (${dir.length} chars); set PWTEST_SOCKETS_DIR to a shorter location.`); + const fsFriendlyName = trimLongString(sanitizeForFilePath(name), maxNameLength); + const result2 = import_path3.default.join(dir, `${fsFriendlyName}${suffix}`); + import_fs3.default.mkdirSync(dir, { recursive: true }); + return result2; +} +var import_fs3, import_os2, import_path3, existsAsync, UNIX_SOCKET_PATH_MAX; +var init_fileUtils = __esm({ + "packages/utils/fileUtils.ts"() { + "use strict"; + import_fs3 = __toESM(require("fs")); + import_os2 = __toESM(require("os")); + import_path3 = __toESM(require("path")); + init_crypto(); + existsAsync = (path66) => new Promise((resolve) => import_fs3.default.stat(path66, (err) => resolve(!err))); + UNIX_SOCKET_PATH_MAX = 103; + } +}); + +// packages/utils/linuxUtils.ts +function getLinuxDistributionInfoSync() { + if (process.platform !== "linux") + return void 0; + if (!osRelease && !didFailToReadOSRelease) { + try { + const osReleaseText = import_fs4.default.readFileSync("/etc/os-release", "utf8"); + const fields = parseOSReleaseText(osReleaseText); + osRelease = { + id: fields.get("id") ?? "", + version: fields.get("version_id") ?? "" + }; + } catch (e) { + didFailToReadOSRelease = true; + } + } + return osRelease; +} +function parseOSReleaseText(osReleaseText) { + const fields = /* @__PURE__ */ new Map(); + for (const line of osReleaseText.split("\n")) { + const tokens = line.split("="); + const name = tokens.shift(); + let value2 = tokens.join("=").trim(); + if (value2.startsWith('"') && value2.endsWith('"')) + value2 = value2.substring(1, value2.length - 1); + if (!name) + continue; + fields.set(name.toLowerCase(), value2); + } + return fields; +} +var import_fs4, didFailToReadOSRelease, osRelease; +var init_linuxUtils = __esm({ + "packages/utils/linuxUtils.ts"() { + "use strict"; + import_fs4 = __toESM(require("fs")); + didFailToReadOSRelease = false; + } +}); + +// packages/utils/hostPlatform.ts +function calculatePlatform() { + if (process.env.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE) { + return { + hostPlatform: process.env.PLAYWRIGHT_HOST_PLATFORM_OVERRIDE, + isOfficiallySupportedPlatform: false + }; + } + const platform = import_os3.default.platform(); + if (platform === "darwin") { + const ver = import_os3.default.release().split(".").map((a) => parseInt(a, 10)); + let macVersion = 0; + if (ver[0] < 18) { + macVersion = 10.13; + } else if (ver[0] === 18) { + macVersion = 10.14; + } else if (ver[0] === 19) { + macVersion = 10.15; + } else if (ver[0] < 25) { + macVersion = 11 + (ver[0] - 20); + } else { + const LAST_STABLE_MACOS_MAJOR_VERSION = 26; + macVersion = Math.min(ver[0] + 1, LAST_STABLE_MACOS_MAJOR_VERSION); + } + let macPlatform = "mac" + macVersion; + if (macVersion >= 11 && import_os3.default.cpus().some((cpu) => cpu.model.includes("Apple"))) { + macPlatform += "-arm64"; + } + return { hostPlatform: macPlatform, isOfficiallySupportedPlatform: macVersion >= 14 }; + } + if (platform === "linux") { + if (!["x64", "arm64"].includes(import_os3.default.arch())) + return { hostPlatform: "", isOfficiallySupportedPlatform: false }; + const archSuffix = "-" + import_os3.default.arch(); + const distroInfo = getLinuxDistributionInfoSync(); + if (distroInfo?.id === "ubuntu" || distroInfo?.id === "pop" || distroInfo?.id === "neon" || distroInfo?.id === "tuxedo") { + const isUbuntu = distroInfo?.id === "ubuntu"; + const version3 = distroInfo?.version; + const major2 = parseInt(distroInfo.version, 10); + if (major2 < 20) + return { hostPlatform: "ubuntu18.04" + archSuffix, isOfficiallySupportedPlatform: false }; + if (major2 < 22) + return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "20.04" }; + if (major2 < 24) + return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "22.04" }; + if (major2 < 26) + return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "24.04" }; + if (major2 < 28) + return { hostPlatform: "ubuntu26.04" + archSuffix, isOfficiallySupportedPlatform: isUbuntu && version3 === "26.04" }; + return { hostPlatform: "ubuntu" + distroInfo.version + archSuffix, isOfficiallySupportedPlatform: false }; + } + if (distroInfo?.id === "linuxmint") { + const mintMajor = parseInt(distroInfo.version, 10); + if (mintMajor <= 20) + return { hostPlatform: "ubuntu20.04" + archSuffix, isOfficiallySupportedPlatform: false }; + if (mintMajor === 21) + return { hostPlatform: "ubuntu22.04" + archSuffix, isOfficiallySupportedPlatform: false }; + return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: false }; + } + if (distroInfo?.id === "debian" || distroInfo?.id === "raspbian") { + if (distroInfo?.version === "11") + return { hostPlatform: "debian11" + archSuffix, isOfficiallySupportedPlatform: false }; + const isOfficiallySupportedPlatform2 = distroInfo?.id === "debian"; + if (distroInfo?.version === "12") + return { hostPlatform: "debian12" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + if (distroInfo?.version === "13") + return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + if (distroInfo?.version === "") + return { hostPlatform: "debian13" + archSuffix, isOfficiallySupportedPlatform: isOfficiallySupportedPlatform2 }; + } + return { hostPlatform: "ubuntu24.04" + archSuffix, isOfficiallySupportedPlatform: false }; + } + if (platform === "win32") + return { hostPlatform: "win64", isOfficiallySupportedPlatform: true }; + return { hostPlatform: "", isOfficiallySupportedPlatform: false }; +} +function toShortPlatform(hostPlatform2) { + if (hostPlatform2 === "") + return ""; + if (hostPlatform2 === "win64") + return "win-x64"; + if (hostPlatform2.startsWith("mac")) + return hostPlatform2.endsWith("arm64") ? "mac-arm64" : "mac-x64"; + return hostPlatform2.endsWith("arm64") ? "linux-arm64" : "linux-x64"; +} +var import_os3, hostPlatform, isOfficiallySupportedPlatform, shortPlatform; +var init_hostPlatform = __esm({ + "packages/utils/hostPlatform.ts"() { + "use strict"; + import_os3 = __toESM(require("os")); + init_linuxUtils(); + ({ hostPlatform, isOfficiallySupportedPlatform } = calculatePlatform()); + shortPlatform = toShortPlatform(hostPlatform); + } +}); + +// packages/utils/happyEyeballs.ts +async function createSocket(host, port) { + return new Promise((resolve, reject) => { + if (import_net.default.isIP(host)) { + const socket = import_net.default.createConnection({ host, port }); + socket.on("connect", () => resolve(socket)); + socket.on("error", (error) => reject(error)); + } else { + createConnectionAsync( + { host, port }, + (err, socket) => { + if (err) + reject(err); + if (socket) + resolve(socket); + }, + /* useTLS */ + false + ).catch((err) => reject(err)); + } + }); +} +async function createConnectionAsync(options, oncreate, useTLS) { + const lookup = options.__testHookLookup || lookupAddresses; + const hostname = clientRequestArgsToHostName(options); + const addresses = await lookup(hostname); + const dnsLookupAt = monotonicTime(); + const sockets = /* @__PURE__ */ new Set(); + let firstError; + let errorCount = 0; + const handleError = (socket, err) => { + if (!sockets.delete(socket)) + return; + ++errorCount; + firstError ??= err; + if (errorCount === addresses.length) + oncreate?.(firstError); + }; + const connected = new ManualPromise(); + for (const { address } of addresses) { + const socket = useTLS ? import_tls.default.connect({ + ...options, + port: options.port, + host: address, + servername: hostname + }) : import_net.default.createConnection({ + ...options, + port: options.port, + host: address + }); + socket[kDNSLookupAt] = dnsLookupAt; + socket.on("connect", () => { + socket[kTCPConnectionAt] = monotonicTime(); + connected.resolve(); + oncreate?.(null, socket); + sockets.delete(socket); + for (const s of sockets) + s.destroy(); + sockets.clear(); + }); + socket.on("timeout", () => { + socket.destroy(); + handleError(socket, new Error("Connection timeout")); + }); + socket.on("error", (e) => handleError(socket, e)); + sockets.add(socket); + await Promise.race([ + connected, + new Promise((f) => setTimeout(f, connectionAttemptDelayMs)) + ]); + if (connected.isDone()) + break; + } +} +async function lookupAddresses(hostname) { + const [v4Result, v6Result] = await Promise.allSettled([ + import_dns.default.promises.lookup(hostname, { all: true, family: 4 }), + import_dns.default.promises.lookup(hostname, { all: true, family: 6 }) + ]); + const v4Addresses = v4Result.status === "fulfilled" ? v4Result.value : []; + const v6Addresses = v6Result.status === "fulfilled" ? v6Result.value : []; + if (!v4Addresses.length && !v6Addresses.length) { + if (v4Result.status === "rejected") + throw v4Result.reason; + throw v6Result.reason; + } + const result2 = []; + for (let i = 0; i < Math.max(v4Addresses.length, v6Addresses.length); i++) { + if (v6Addresses[i]) + result2.push(v6Addresses[i]); + if (v4Addresses[i]) + result2.push(v4Addresses[i]); + } + return result2; +} +function clientRequestArgsToHostName(options) { + if (options.hostname) + return options.hostname; + if (options.host) + return options.host; + throw new Error("Either options.hostname or options.host must be provided"); +} +function timingForSocket(socket) { + return { + dnsLookupAt: socket[kDNSLookupAt], + tcpConnectionAt: socket[kTCPConnectionAt] + }; +} +var import_dns, import_http, import_https, import_net, import_tls, connectionAttemptDelayMs, kDNSLookupAt, kTCPConnectionAt, HttpHappyEyeballsAgent, HttpsHappyEyeballsAgent, httpsHappyEyeballsAgent, httpHappyEyeballsAgent; +var init_happyEyeballs = __esm({ + "packages/utils/happyEyeballs.ts"() { + "use strict"; + import_dns = __toESM(require("dns")); + import_http = __toESM(require("http")); + import_https = __toESM(require("https")); + import_net = __toESM(require("net")); + import_tls = __toESM(require("tls")); + init_assert(); + init_manualPromise(); + init_time(); + connectionAttemptDelayMs = 300; + kDNSLookupAt = /* @__PURE__ */ Symbol("kDNSLookupAt"); + kTCPConnectionAt = /* @__PURE__ */ Symbol("kTCPConnectionAt"); + HttpHappyEyeballsAgent = class extends import_http.default.Agent { + createConnection(options, oncreate) { + if (import_net.default.isIP(clientRequestArgsToHostName(options))) + return import_net.default.createConnection(options); + const cb = oncreate; + createConnectionAsync( + options, + cb, + /* useTLS */ + false + ).catch((err) => cb?.(err)); + } + }; + HttpsHappyEyeballsAgent = class extends import_https.default.Agent { + createConnection(options, oncreate) { + if (import_net.default.isIP(clientRequestArgsToHostName(options))) + return import_tls.default.connect(options); + const cb = oncreate; + createConnectionAsync( + options, + cb, + /* useTLS */ + true + ).catch((err) => cb?.(err)); + } + }; + httpsHappyEyeballsAgent = new HttpsHappyEyeballsAgent({ keepAlive: true }); + httpHappyEyeballsAgent = new HttpHappyEyeballsAgent({ keepAlive: true }); + } +}); + +// packages/utils/network.ts +function httpRequest(params2, onResponse, onError) { + let url3 = new URL(params2.url); + const options = { + method: params2.method || "GET", + headers: params2.headers + }; + if (params2.rejectUnauthorized !== void 0) + options.rejectUnauthorized = params2.rejectUnauthorized; + const proxyURL = getProxyForUrl(params2.url); + if (proxyURL) { + const parsedProxyURL = normalizeProxyURL(proxyURL); + if (params2.url.startsWith("http:")) { + options.path = url3.toString(); + const headers = options.headers || {}; + if (!Object.keys(headers).some((header) => header.toLowerCase() === "host")) + headers.host = url3.host; + options.headers = headers; + url3 = parsedProxyURL; + } else { + options.agent = new HttpsProxyAgent(parsedProxyURL); + } + } + options.agent ??= url3.protocol === "https:" ? httpsHappyEyeballsAgent : httpHappyEyeballsAgent; + let cancelRequest; + const requestCallback = (res) => { + const statusCode = res.statusCode || 0; + if (statusCode >= 300 && statusCode < 400 && res.headers.location) { + request2.destroy(); + cancelRequest = httpRequest({ ...params2, url: new URL(res.headers.location, params2.url).toString() }, onResponse, onError).cancel; + } else { + onResponse(res); + } + }; + const request2 = url3.protocol === "https:" ? import_https2.default.request(url3, options, requestCallback) : import_http2.default.request(url3, options, requestCallback); + request2.on("error", onError); + if (params2.socketTimeout !== void 0) { + request2.setTimeout(params2.socketTimeout, () => { + onError(new Error(`Request to ${params2.url} timed out after ${params2.socketTimeout}ms`)); + request2.abort(); + }); + } + cancelRequest = (e) => { + try { + request2.destroy(e); + } catch { + } + }; + request2.end(params2.data); + return { cancel: (e) => cancelRequest(e) }; +} +function shouldBypassProxy(url3, bypass) { + if (!bypass) + return false; + const domains = bypass.split(",").map((s) => { + s = s.trim(); + if (!s.startsWith(".")) + s = "." + s; + return s; + }); + const domain = "." + url3.hostname; + return domains.some((d) => domain.endsWith(d)); +} +function normalizeProxyURL(proxy) { + proxy = proxy.trim(); + if (!/^\w+:\/\//.test(proxy)) + proxy = "http://" + proxy; + return new URL(proxy); +} +function createProxyAgent(proxy, forUrl) { + if (!proxy) + return; + if (forUrl && proxy.bypass && shouldBypassProxy(forUrl, proxy.bypass)) + return; + const proxyURL = normalizeProxyURL(proxy.server); + if (proxyURL.protocol?.startsWith("socks")) { + if (proxyURL.protocol === "socks5:") + proxyURL.protocol = "socks5h:"; + else if (proxyURL.protocol === "socks4:") + proxyURL.protocol = "socks4a:"; + return new SocksProxyAgent(proxyURL); + } + if (proxy.username) { + proxyURL.username = proxy.username; + proxyURL.password = proxy.password || ""; + } + if (forUrl && ["ws:", "wss:"].includes(forUrl.protocol)) { + return new HttpsProxyAgent(proxyURL); + } + return new HttpsProxyAgent(proxyURL); +} +function createHttpServer(...args) { + const server = import_http2.default.createServer(...args); + decorateServer(server); + return server; +} +function createHttpsServer(...args) { + const server = import_https2.default.createServer(...args); + decorateServer(server); + return server; +} +function createHttp2Server(...args) { + const server = import_http22.default.createSecureServer(...args); + decorateServer(server); + return server; +} +async function startHttpServer(server, options) { + const { host = "localhost", port = 0 } = options; + const errorPromise = new ManualPromise(); + const errorListener = (error) => errorPromise.reject(error); + server.on("error", errorListener); + try { + server.listen(port, host); + await Promise.race([ + new Promise((cb) => server.once("listening", cb)), + errorPromise + ]); + } finally { + server.removeListener("error", errorListener); + } +} +async function isURLAvailable(url3, ignoreHTTPSErrors, onLog, onStdErr) { + let statusCode = await httpStatusCode(url3, ignoreHTTPSErrors, onLog, onStdErr); + if (statusCode === 404 && url3.pathname === "/") { + const indexUrl = new URL(url3); + indexUrl.pathname = "/index.html"; + statusCode = await httpStatusCode(indexUrl, ignoreHTTPSErrors, onLog, onStdErr); + } + return statusCode >= 200 && statusCode < 404; +} +async function httpStatusCode(url3, ignoreHTTPSErrors, onLog, onStdErr) { + return new Promise((resolve) => { + onLog?.(`HTTP GET: ${url3}`); + httpRequest({ + url: url3.toString(), + headers: { Accept: "*/*" }, + rejectUnauthorized: !ignoreHTTPSErrors + }, (res) => { + res.resume(); + const statusCode = res.statusCode ?? 0; + onLog?.(`HTTP Status: ${statusCode}`); + resolve(statusCode); + }, (error) => { + if (error.code === "DEPTH_ZERO_SELF_SIGNED_CERT") + onStdErr?.(`[WebServer] Self-signed certificate detected. Try adding ignoreHTTPSErrors: true to config.webServer.`); + onLog?.(`Error while checking if ${url3} is available: ${error.message}`); + resolve(0); + }); + }); +} +function decorateServer(server) { + const sockets = /* @__PURE__ */ new Set(); + server.on("connection", (socket) => { + sockets.add(socket); + socket.once("close", () => sockets.delete(socket)); + }); + const close3 = server.close; + server.close = (callback) => { + for (const socket of sockets) + socket.destroy(); + sockets.clear(); + return close3.call(server, callback); + }; +} +var import_http2, import_http22, import_https2, HttpsProxyAgent, SocksProxyAgent, getProxyForUrl, NET_DEFAULT_TIMEOUT; +var init_network = __esm({ + "packages/utils/network.ts"() { + "use strict"; + import_http2 = __toESM(require("http")); + import_http22 = __toESM(require("http2")); + import_https2 = __toESM(require("https")); + init_manualPromise(); + init_happyEyeballs(); + ({ HttpsProxyAgent } = require("./utilsBundle")); + ({ SocksProxyAgent } = require("./utilsBundle")); + ({ getProxyForUrl } = require("./utilsBundle")); + NET_DEFAULT_TIMEOUT = 3e4; + } +}); + +// packages/utils/httpServer.ts +function computeAllowedHosts(requested, bound) { + const loopback = /* @__PURE__ */ new Set(["127.0.0.1", "::1", "localhost"]); + const isLoopback = (h) => h !== void 0 && loopback.has(h.toLowerCase()); + if (!isLoopback(requested) && requested !== void 0) + return null; + if (!isLoopback(bound) && requested === void 0) + return null; + return /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "[::1]"]); +} +function urlHostFromAddress(address) { + return address.family === "IPv6" ? `[${address.address}]` : address.address; +} +function hostnameFromHostHeader(host) { + if (host.startsWith("[")) { + const end = host.indexOf("]"); + return end < 0 ? host : host.substring(0, end + 1); + } + const colon = host.indexOf(":"); + return colon < 0 ? host : host.substring(0, colon); +} +function serveFolder(folder) { + const server = new HttpServer(folder); + server.routePrefix("/", (request2, response2) => { + let relativePath = new URL("http://localhost" + request2.url).pathname; + if (relativePath.startsWith("/trace/file")) { + const url3 = new URL("http://localhost" + request2.url); + const requested = url3.searchParams.get("path"); + if (!requested) + return false; + const resolved = import_path4.default.resolve(requested); + try { + return server.serveFile(request2, response2, resolved); + } catch (e) { + return false; + } + } + if (relativePath === "/") + relativePath = "/index.html"; + const absolutePath = import_path4.default.join(folder, ...relativePath.split("/")); + return server.serveFile(request2, response2, absolutePath); + }); + return server; +} +var import_fs5, import_path4, mime, wsServer, HttpServer; +var init_httpServer = __esm({ + "packages/utils/httpServer.ts"() { + "use strict"; + import_fs5 = __toESM(require("fs")); + import_path4 = __toESM(require("path")); + init_assert(); + init_crypto(); + init_fileUtils(); + init_network(); + mime = require("./utilsBundle").mime; + ({ wsServer } = require("./utilsBundle")); + HttpServer = class { + constructor(staticRoot) { + this._urlPrefixPrecise = ""; + this._urlPrefixHumanReadable = ""; + this._port = 0; + this._started = false; + this._routes = []; + // Allowed Host headers; null disables the check (host bound to a public address). + this._allowedHosts = null; + this._server = createHttpServer(this._onRequest.bind(this)); + this._staticRoot = staticRoot ? import_path4.default.resolve(staticRoot) : void 0; + } + server() { + return this._server; + } + routePrefix(prefix, handler) { + this._routes.push({ prefix, handler }); + } + routePath(path66, handler) { + this._routes.push({ exact: path66, handler }); + } + port() { + return this._port; + } + createWebSocket(transportFactory, guid) { + assert(!this._wsGuid, "can only create one main websocket transport per server"); + this._wsGuid = guid || createGuid(); + const wsPath = "/" + this._wsGuid; + const wss = new wsServer({ noServer: true }); + this._server.on("upgrade", (request2, socket, head) => { + const pathname = new URL(request2.url ?? "/", "http://localhost").pathname; + if (pathname !== wsPath) + return; + wss.handleUpgrade(request2, socket, head, (ws4) => wss.emit("connection", ws4, request2)); + }); + wss.on("connection", (ws4, request2) => { + const url3 = new URL(request2.url ?? "/", "http://localhost"); + const transport = transportFactory(url3); + transport.sendEvent = (method, params2) => ws4.send(JSON.stringify({ method, params: params2 })); + transport.close = () => ws4.close(); + transport.onconnect(); + ws4.on("message", async (message) => { + const { id, method, params: params2 } = JSON.parse(String(message)); + try { + const result2 = await transport.dispatch(method, params2); + ws4.send(JSON.stringify({ id, result: result2 })); + } catch (e) { + ws4.send(JSON.stringify({ id, error: String(e) })); + } + }); + ws4.on("close", () => transport.onclose()); + ws4.on("error", () => transport.onclose()); + }); + } + wsGuid() { + return this._wsGuid; + } + async createViteDevServer(options) { + const loadVite = new Function('return import("vite")'); + const vite = await loadVite(); + return await vite.createServer({ + root: options.root, + base: options.base, + server: { + middlewareMode: true, + // Dedicated path so Vite's HMR websocket does not collide with any + // websocket HttpServer owns via createWebSocket(). + hmr: { path: "/__vite_hmr", server: this._server } + }, + appType: "spa", + clearScreen: false + }); + } + // HMR end + // Vite's middleware `next` callback for the "no middleware matched" case; + // emits a 404 only if nothing downstream already responded. + static notFoundFallback(response2) { + return () => { + if (!response2.headersSent) { + response2.statusCode = 404; + response2.end(); + } + }; + } + async start(options = {}) { + assert(!this._started, "server already started"); + this._started = true; + const host = options.host; + if (options.preferredPort) { + try { + await startHttpServer(this._server, { port: options.preferredPort, host }); + } catch (e) { + if (!e || !e.message || !e.message.includes("EADDRINUSE")) + throw e; + await startHttpServer(this._server, { host }); + } + } else { + await startHttpServer(this._server, { port: options.port, host }); + } + const address = this._server.address(); + assert(address, "Could not bind server socket"); + if (typeof address === "string") { + this._urlPrefixPrecise = address; + this._urlPrefixHumanReadable = address; + } else { + this._port = address.port; + this._urlPrefixPrecise = `http://${urlHostFromAddress(address)}:${address.port}`; + this._urlPrefixHumanReadable = `http://${host ?? "localhost"}:${address.port}`; + this._allowedHosts = computeAllowedHosts(host, address.address); + } + } + async stop() { + await new Promise((cb) => this._server.close(cb)); + } + urlPrefix(purpose) { + return purpose === "human-readable" ? this._urlPrefixHumanReadable : this._urlPrefixPrecise; + } + serveFile(request2, response2, absoluteFilePath, headers, options) { + if (this._staticRoot && !options?.skipRootCheck && !isPathInside(this._staticRoot, absoluteFilePath)) { + response2.statusCode = 403; + response2.end(); + return true; + } + try { + for (const [name, value2] of Object.entries(headers || {})) + response2.setHeader(name, value2); + if (request2.headers.range) + this._serveRangeFile(request2, response2, absoluteFilePath); + else + this._serveFile(response2, absoluteFilePath); + return true; + } catch (e) { + return false; + } + } + _serveFile(response2, absoluteFilePath) { + const content = import_fs5.default.readFileSync(absoluteFilePath); + response2.statusCode = 200; + const contentType = mime.getType(import_path4.default.extname(absoluteFilePath)) || "application/octet-stream"; + response2.setHeader("Content-Type", contentType); + response2.setHeader("Content-Length", content.byteLength); + response2.end(content); + } + _serveRangeFile(request2, response2, absoluteFilePath) { + const range = request2.headers.range; + if (!range || !range.startsWith("bytes=") || range.includes(", ") || [...range].filter((char) => char === "-").length !== 1) { + response2.statusCode = 400; + return response2.end("Bad request"); + } + const [startStr, endStr] = range.replace(/bytes=/, "").split("-"); + let start3; + let end; + const size = import_fs5.default.statSync(absoluteFilePath).size; + if (startStr !== "" && endStr === "") { + start3 = +startStr; + end = size - 1; + } else if (startStr === "" && endStr !== "") { + start3 = size - +endStr; + end = size - 1; + } else { + start3 = +startStr; + end = +endStr; + } + if (Number.isNaN(start3) || Number.isNaN(end) || start3 >= size || end >= size || start3 > end) { + response2.writeHead(416, { + "Content-Range": `bytes */${size}` + }); + return response2.end(); + } + response2.writeHead(206, { + "Content-Range": `bytes ${start3}-${end}/${size}`, + "Accept-Ranges": "bytes", + "Content-Length": end - start3 + 1, + "Content-Type": mime.getType(import_path4.default.extname(absoluteFilePath)) + }); + const readable = import_fs5.default.createReadStream(absoluteFilePath, { start: start3, end }); + readable.pipe(response2); + } + _onRequest(request2, response2) { + if (request2.method === "OPTIONS") { + response2.writeHead(200); + response2.end(); + return; + } + if (this._allowedHosts) { + const host = request2.headers.host?.toLowerCase(); + const hostname = host ? hostnameFromHostHeader(host) : void 0; + if (!hostname || !this._allowedHosts.has(hostname)) { + response2.statusCode = 403; + response2.end(); + return; + } + } + request2.on("error", () => response2.end()); + try { + if (!request2.url) { + response2.end(); + return; + } + const url3 = new URL("http://localhost" + request2.url); + for (const route2 of this._routes) { + if (route2.exact && url3.pathname === route2.exact && route2.handler(request2, response2)) + return; + if (route2.prefix && url3.pathname.startsWith(route2.prefix) && route2.handler(request2, response2)) + return; + } + response2.statusCode = 404; + response2.end(); + } catch (e) { + response2.end(); + } + } + }; + } +}); + +// packages/utils/processLauncher.ts +async function gracefullyCloseAll() { + await Promise.all(Array.from(gracefullyCloseSet).map((gracefullyClose) => gracefullyClose().catch((e) => { + }))); +} +function gracefullyProcessExitDoNotHang(code, onExit2) { + const beforeExit = onExit2 ? () => onExit2().catch(() => { + }) : () => Promise.resolve(); + const callback = () => beforeExit().then(() => process.exit(code)); + setTimeout(callback, 3e4); + gracefullyCloseAll().then(callback); +} +function exitHandler() { + for (const kill of killSet) + kill(); +} +function sigintHandler() { + const exitWithCode130 = () => { + if (isUnderTest()) { + setTimeout(() => process.exit(130), 1e3); + } else { + process.exit(130); + } + }; + if (sigintHandlerCalled) { + process.off("SIGINT", sigintHandler); + for (const kill of killSet) + kill(); + exitWithCode130(); + } else { + sigintHandlerCalled = true; + gracefullyCloseAll().then(() => exitWithCode130()); + } +} +function sigtermHandler() { + gracefullyCloseAll(); +} +function sighupHandler() { + gracefullyCloseAll(); +} +function addProcessHandlerIfNeeded(name) { + if (!installedHandlers.has(name)) { + installedHandlers.add(name); + process.on(name, processHandlers[name]); + } +} +function removeProcessHandlersIfNeeded() { + if (killSet.size) + return; + for (const handler of installedHandlers) + process.off(handler, processHandlers[handler]); + installedHandlers.clear(); +} +async function launchProcess(options) { + const stdio = options.stdio === "pipe" ? ["ignore", "pipe", "pipe", "pipe", "pipe"] : ["pipe", "pipe", "pipe"]; + options.log(` ${options.command} ${options.args ? options.args.join(" ") : ""}`); + const spawnOptions = { + // On non-windows platforms, `detached: true` makes child process a leader of a new + // process group, making it possible to kill child process tree with `.kill(-pid)` command. + // @see https://nodejs.org/api/child_process.html#child_process_options_detached + detached: process.platform !== "win32", + env: options.env, + cwd: options.cwd, + shell: options.shell, + stdio + }; + const spawnedProcess = childProcess.spawn(options.command, options.args || [], spawnOptions); + const cleanup = async () => { + options.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`); + const errors = await removeFolders(options.tempDirectories); + for (let i = 0; i < options.tempDirectories.length; ++i) { + if (errors[i]) + options.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${options.tempDirectories[i]}: ${errors[i]}`); + } + options.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`); + }; + spawnedProcess.on("error", () => { + }); + if (!spawnedProcess.pid) { + let failed; + const failedPromise = new Promise((f, r) => failed = f); + spawnedProcess.once("error", (error) => { + failed(new Error("Failed to launch: " + error)); + }); + return failedPromise.then(async (error) => { + await cleanup(); + throw error; + }); + } + options.log(` pid=${spawnedProcess.pid}`); + const stdout = readline.createInterface({ input: spawnedProcess.stdout }); + stdout.on("line", (data) => { + options.log(`[pid=${spawnedProcess.pid}][out] ` + data); + }); + const stderr = readline.createInterface({ input: spawnedProcess.stderr }); + stderr.on("line", (data) => { + options.log(`[pid=${spawnedProcess.pid}][err] ` + data); + }); + let processClosed = false; + let fulfillCleanup = () => { + }; + const waitForCleanup = new Promise((f) => fulfillCleanup = f); + spawnedProcess.once("close", (exitCode, signal) => { + options.log(`[pid=${spawnedProcess.pid}] `); + processClosed = true; + gracefullyCloseSet.delete(gracefullyClose); + killSet.delete(killProcessAndCleanup); + removeProcessHandlersIfNeeded(); + options.onExit(exitCode, signal); + cleanup().then(fulfillCleanup); + }); + addProcessHandlerIfNeeded("exit"); + if (options.handleSIGINT) + addProcessHandlerIfNeeded("SIGINT"); + if (options.handleSIGTERM) + addProcessHandlerIfNeeded("SIGTERM"); + if (options.handleSIGHUP) + addProcessHandlerIfNeeded("SIGHUP"); + gracefullyCloseSet.add(gracefullyClose); + killSet.add(killProcessAndCleanup); + let gracefullyClosing = false; + async function gracefullyClose() { + if (gracefullyClosing) { + options.log(`[pid=${spawnedProcess.pid}] `); + killProcess(); + await waitForCleanup; + return; + } + gracefullyClosing = true; + options.log(`[pid=${spawnedProcess.pid}] `); + await options.attemptToGracefullyClose().catch(() => killProcess()); + await waitForCleanup; + options.log(`[pid=${spawnedProcess.pid}] `); + } + function killProcess() { + gracefullyCloseSet.delete(gracefullyClose); + killSet.delete(killProcessAndCleanup); + removeProcessHandlersIfNeeded(); + options.log(`[pid=${spawnedProcess.pid}] `); + if (spawnedProcess.pid && !spawnedProcess.killed && !processClosed) { + options.log(`[pid=${spawnedProcess.pid}] `); + try { + if (process.platform === "win32") { + const taskkillProcess = childProcess.spawnSync(`taskkill /pid ${spawnedProcess.pid} /T /F`, { shell: true }); + const [stdout2, stderr2] = [taskkillProcess.stdout.toString(), taskkillProcess.stderr.toString()]; + if (stdout2) + options.log(`[pid=${spawnedProcess.pid}] taskkill stdout: ${stdout2}`); + if (stderr2) + options.log(`[pid=${spawnedProcess.pid}] taskkill stderr: ${stderr2}`); + } else { + process.kill(-spawnedProcess.pid, "SIGKILL"); + } + } catch (e) { + options.log(`[pid=${spawnedProcess.pid}] exception while trying to kill process: ${e}`); + } + } else { + options.log(`[pid=${spawnedProcess.pid}] `); + } + } + function killProcessAndCleanup() { + killProcess(); + options.log(`[pid=${spawnedProcess.pid || "N/A"}] starting temporary directories cleanup`); + for (const dir of options.tempDirectories) { + try { + import_fs6.default.rmSync(dir, { force: true, recursive: true, maxRetries: 5 }); + } catch (e) { + options.log(`[pid=${spawnedProcess.pid || "N/A"}] exception while removing ${dir}: ${e}`); + } + } + options.log(`[pid=${spawnedProcess.pid || "N/A"}] finished temporary directories cleanup`); + } + function killAndWait() { + killProcess(); + return waitForCleanup; + } + return { launchedProcess: spawnedProcess, gracefullyClose, kill: killAndWait }; +} +function envArrayToObject(env) { + const result2 = {}; + for (const { name, value: value2 } of env) + result2[name] = value2; + return result2; +} +var childProcess, import_fs6, readline, gracefullyCloseSet, killSet, sigintHandlerCalled, installedHandlers, processHandlers; +var init_processLauncher = __esm({ + "packages/utils/processLauncher.ts"() { + "use strict"; + childProcess = __toESM(require("child_process")); + import_fs6 = __toESM(require("fs")); + readline = __toESM(require("readline")); + init_fileUtils(); + init_debug(); + gracefullyCloseSet = /* @__PURE__ */ new Set(); + killSet = /* @__PURE__ */ new Set(); + sigintHandlerCalled = false; + installedHandlers = /* @__PURE__ */ new Set(); + processHandlers = { + exit: exitHandler, + SIGINT: sigintHandler, + SIGTERM: sigtermHandler, + SIGHUP: sighupHandler + }; + } +}); + +// packages/utils/profiler.ts +async function startProfiling() { + if (!profileDir) + return; + session = new (require("inspector")).Session(); + session.connect(); + await new Promise((f) => { + session.post("Profiler.enable", () => { + session.post("Profiler.start", f); + }); + }); +} +async function stopProfiling(profileName) { + if (!profileDir) + return; + await new Promise((f) => session.post("Profiler.stop", (err, { profile }) => { + if (!err) { + import_fs7.default.mkdirSync(profileDir, { recursive: true }); + import_fs7.default.writeFileSync(import_path5.default.join(profileDir, profileName + ".json"), JSON.stringify(profile)); + } + f(); + })); +} +var import_fs7, import_path5, profileDir, session; +var init_profiler = __esm({ + "packages/utils/profiler.ts"() { + "use strict"; + import_fs7 = __toESM(require("fs")); + import_path5 = __toESM(require("path")); + profileDir = process.env.PWTEST_PROFILE_DIR || ""; + } +}); + +// packages/utils/serializedFS.ts +var import_fs8, yazl, APPEND_CHUNK_SIZE, SerializedFS; +var init_serializedFS = __esm({ + "packages/utils/serializedFS.ts"() { + "use strict"; + import_fs8 = __toESM(require("fs")); + init_manualPromise(); + yazl = require("./utilsBundle").yazl; + APPEND_CHUNK_SIZE = 64 * 1024; + SerializedFS = class { + constructor() { + this._buffers = /* @__PURE__ */ new Map(); + this._operations = []; + this._operationsDone = new ManualPromise(); + this._operationsDone.resolve(); + } + mkdir(dir) { + this._appendOperation({ op: "mkdir", dir }); + } + writeFile(file, content, skipIfExists) { + this._buffers.delete(file); + this._appendOperation({ op: "writeFile", file, content, skipIfExists }); + } + appendFile(file, text2, flush) { + if (!this._buffers.has(file)) + this._buffers.set(file, []); + const buffer = this._buffers.get(file); + buffer.push(text2); + let size = 0; + for (const chunk of buffer) + size += chunk.length; + if (flush || size >= APPEND_CHUNK_SIZE) + this._flushFile(file); + } + _flushFile(file) { + const buffer = this._buffers.get(file); + if (buffer === void 0) + return; + const content = buffer.join(""); + this._buffers.delete(file); + this._appendOperation({ op: "appendFile", file, content }); + } + copyFile(from, to) { + this._flushFile(from); + this._buffers.delete(to); + this._appendOperation({ op: "copyFile", from, to }); + } + async syncAndGetError() { + for (const file of this._buffers.keys()) + this._flushFile(file); + await this._operationsDone; + return this._error; + } + zip(entries, zipFileName) { + for (const file of this._buffers.keys()) + this._flushFile(file); + this._appendOperation({ op: "zip", entries, zipFileName }); + } + // This method serializes all writes to the trace. + _appendOperation(op) { + const last = this._operations[this._operations.length - 1]; + if (last?.op === "appendFile" && op.op === "appendFile" && last.file === op.file && last.content.length < APPEND_CHUNK_SIZE) { + last.content += op.content; + return; + } + this._operations.push(op); + if (this._operationsDone.isDone()) + this._performOperations(); + } + async _performOperations() { + this._operationsDone = new ManualPromise(); + while (this._operations.length) { + const op = this._operations.shift(); + if (this._error) + continue; + try { + await this._performOperation(op); + } catch (e) { + this._error = e; + } + } + this._operationsDone.resolve(); + } + async _performOperation(op) { + switch (op.op) { + case "mkdir": { + await import_fs8.default.promises.mkdir(op.dir, { recursive: true }); + return; + } + case "writeFile": { + if (op.skipIfExists) + await import_fs8.default.promises.writeFile(op.file, op.content, { flag: "wx" }).catch(() => { + }); + else + await import_fs8.default.promises.writeFile(op.file, op.content); + return; + } + case "copyFile": { + await import_fs8.default.promises.copyFile(op.from, op.to); + return; + } + case "appendFile": { + await import_fs8.default.promises.appendFile(op.file, op.content); + return; + } + case "zip": { + const zipFile = new yazl.ZipFile(); + const result2 = new ManualPromise(); + zipFile.on("error", (error) => result2.reject(error)); + for (const entry of op.entries) + zipFile.addFile(entry.value, entry.name); + zipFile.end(); + zipFile.outputStream.pipe(import_fs8.default.createWriteStream(op.zipFileName)).on("close", () => result2.resolve()).on("error", (error) => result2.reject(error)); + await result2; + return; + } + } + } + }; + } +}); + +// packages/utils/socksProxy.ts +function hexToNumber(hex) { + return [...hex].reduce((value2, digit2) => { + const code = digit2.charCodeAt(0); + if (code >= 48 && code <= 57) + return value2 + code; + if (code >= 97 && code <= 102) + return value2 + (code - 97) + 10; + if (code >= 65 && code <= 70) + return value2 + (code - 65) + 10; + throw new Error("Invalid IPv6 token " + hex); + }, 0); +} +function ipToSocksAddress(address) { + const ipv4Mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address); + if (ipv4Mapped) + address = ipv4Mapped[1]; + if (import_net2.default.isIPv4(address)) { + return [ + 1, + // IPv4 + ...address.split(".", 4).map((t) => +t & 255) + // Address + ]; + } + if (import_net2.default.isIPv6(address)) { + const result2 = [4]; + const tokens = address.split(":", 8); + while (tokens.length < 8) + tokens.unshift(""); + for (const token of tokens) { + const value2 = hexToNumber(token); + result2.push(value2 >> 8 & 255, value2 & 255); + } + return result2; + } + throw new Error("Only IPv4 and IPv6 addresses are supported"); +} +function starMatchToRegex(pattern) { + const source12 = pattern.split("*").map((s) => { + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + }).join(".*"); + return new RegExp("^" + source12 + "$"); +} +function parsePattern(pattern) { + if (!pattern) + return () => false; + const matchers = pattern.split(",").map((token) => { + const match = token.match(/^(.*?)(?::(\d+))?$/); + if (!match) + throw new Error(`Unsupported token "${token}" in pattern "${pattern}"`); + const tokenPort = match[2] ? +match[2] : void 0; + const portMatches = (port) => tokenPort === void 0 || tokenPort === port; + let tokenHost = match[1]; + if (tokenHost === "") { + return (host, port) => { + if (!portMatches(port)) + return false; + return host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1" || host === "[::1]"; + }; + } + if (tokenHost === "*") + return (host, port) => portMatches(port); + if (import_net2.default.isIPv4(tokenHost) || import_net2.default.isIPv6(tokenHost)) + return (host, port) => host === tokenHost && portMatches(port); + if (tokenHost[0] === ".") + tokenHost = "*" + tokenHost; + const tokenRegex = starMatchToRegex(tokenHost); + return (host, port) => { + if (!portMatches(port)) + return false; + if (import_net2.default.isIPv4(host) || import_net2.default.isIPv6(host)) + return false; + return !!host.match(tokenRegex); + }; + }); + return (host, port) => matchers.some((matcher) => matcher(host, port)); +} +var import_events, import_net2, SocksConnection, SocksProxy, SocksProxyHandler; +var init_socksProxy = __esm({ + "packages/utils/socksProxy.ts"() { + "use strict"; + import_events = __toESM(require("events")); + import_net2 = __toESM(require("net")); + init_assert(); + init_crypto(); + init_debugLogger(); + init_happyEyeballs(); + SocksConnection = class { + constructor(uid, socket, client) { + this._buffer = Buffer.from([]); + this._offset = 0; + this._fence = 0; + this._uid = uid; + this._socket = socket; + this._client = client; + this._boundOnData = this._onData.bind(this); + socket.on("data", this._boundOnData); + socket.on("close", () => this._onClose()); + socket.on("end", () => this._onClose()); + socket.on("error", () => this._onClose()); + this._run().catch(() => this._socket.end()); + } + async _run() { + assert(await this._authenticate()); + const { command, host, port } = await this._parseRequest(); + if (command !== 1 /* CONNECT */) { + this._writeBytes(Buffer.from([ + 5, + 7 /* CommandNotSupported */, + 0, + // RSV + 1, + // IPv4 + 0, + 0, + 0, + 0, + // Address + 0, + 0 + // Port + ])); + return; + } + this._socket.off("data", this._boundOnData); + this._client.onSocketRequested({ uid: this._uid, host, port }); + } + async _authenticate() { + const version3 = await this._readByte(); + assert(version3 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version3); + const nMethods = await this._readByte(); + assert(nMethods, "No authentication methods specified"); + const methods = await this._readBytes(nMethods); + for (const method of methods) { + if (method === 0) { + this._writeBytes(Buffer.from([version3, method])); + return true; + } + } + this._writeBytes(Buffer.from([version3, 255 /* NO_ACCEPTABLE_METHODS */])); + return false; + } + async _parseRequest() { + const version3 = await this._readByte(); + assert(version3 === 5, "The VER field must be set to x05 for this version of the protocol, was " + version3); + const command = await this._readByte(); + await this._readByte(); + const addressType = await this._readByte(); + let host = ""; + switch (addressType) { + case 1 /* IPv4 */: + host = (await this._readBytes(4)).join("."); + break; + case 3 /* FqName */: + const length = await this._readByte(); + host = (await this._readBytes(length)).toString(); + break; + case 4 /* IPv6 */: + const bytes = await this._readBytes(16); + const tokens = []; + for (let i = 0; i < 8; ++i) + tokens.push(bytes.readUInt16BE(i * 2).toString(16)); + host = tokens.join(":"); + break; + } + const port = (await this._readBytes(2)).readUInt16BE(0); + this._buffer = Buffer.from([]); + this._offset = 0; + this._fence = 0; + return { + command, + host, + port + }; + } + async _readByte() { + const buffer = await this._readBytes(1); + return buffer[0]; + } + async _readBytes(length) { + this._fence = this._offset + length; + if (!this._buffer || this._buffer.length < this._fence) + await new Promise((f) => this._fenceCallback = f); + this._offset += length; + return this._buffer.slice(this._offset - length, this._offset); + } + _writeBytes(buffer) { + if (this._socket.writable) + this._socket.write(buffer); + } + _onClose() { + this._client.onSocketClosed({ uid: this._uid }); + } + _onData(buffer) { + this._buffer = Buffer.concat([this._buffer, buffer]); + if (this._fenceCallback && this._buffer.length >= this._fence) { + const callback = this._fenceCallback; + this._fenceCallback = void 0; + callback(); + } + } + socketConnected(host, port) { + this._writeBytes(Buffer.from([ + 5, + 0 /* Succeeded */, + 0, + // RSV + ...ipToSocksAddress(host), + // ATYP, Address + port >> 8, + port & 255 + // Port + ])); + this._socket.on("data", (data) => this._client.onSocketData({ uid: this._uid, data })); + } + socketFailed(errorCode) { + const buffer = Buffer.from([ + 5, + 0, + 0, + // RSV + ...ipToSocksAddress("0.0.0.0"), + // ATYP, Address + 0, + 0 + // Port + ]); + switch (errorCode) { + case "ENOENT": + case "ENOTFOUND": + case "ETIMEDOUT": + case "EHOSTUNREACH": + buffer[1] = 4 /* HostUnreachable */; + break; + case "ENETUNREACH": + buffer[1] = 3 /* NetworkUnreachable */; + break; + case "ECONNREFUSED": + buffer[1] = 5 /* ConnectionRefused */; + break; + case "ERULESET": + buffer[1] = 2 /* NotAllowedByRuleSet */; + break; + } + this._writeBytes(buffer); + this._socket.end(); + } + sendData(data) { + this._socket.write(data); + } + end() { + this._socket.end(); + } + error(error) { + this._socket.destroy(new Error(error)); + } + }; + SocksProxy = class _SocksProxy extends import_events.default { + constructor() { + super(); + this._connections = /* @__PURE__ */ new Map(); + this._sockets = /* @__PURE__ */ new Set(); + this._closed = false; + this._patternMatcher = () => false; + this._directSockets = /* @__PURE__ */ new Map(); + this._server = new import_net2.default.Server((socket) => { + const uid = createGuid(); + const connection = new SocksConnection(uid, socket, this); + this._connections.set(uid, connection); + }); + this._server.on("connection", (socket) => { + if (this._closed) { + socket.destroy(); + return; + } + this._sockets.add(socket); + socket.once("close", () => this._sockets.delete(socket)); + }); + } + static { + this.Events = { + SocksRequested: "socksRequested", + SocksData: "socksData", + SocksClosed: "socksClosed" + }; + } + setPattern(pattern) { + try { + this._patternMatcher = parsePattern(pattern); + } catch (e) { + this._patternMatcher = () => false; + } + } + async _handleDirect(request2) { + try { + const socket = await createSocket(request2.host, request2.port); + socket.on("data", (data) => this._connections.get(request2.uid)?.sendData(data)); + socket.on("error", (error) => { + this._connections.get(request2.uid)?.error(error.message); + this._directSockets.delete(request2.uid); + }); + socket.on("end", () => { + this._connections.get(request2.uid)?.end(); + this._directSockets.delete(request2.uid); + }); + const localAddress = socket.localAddress; + const localPort = socket.localPort; + this._directSockets.set(request2.uid, socket); + this._connections.get(request2.uid)?.socketConnected(localAddress, localPort); + } catch (error) { + this._connections.get(request2.uid)?.socketFailed(error.code); + } + } + port() { + return this._port; + } + async listen(port, hostname) { + return new Promise((f) => { + this._server.listen(port, hostname, () => { + const port2 = this._server.address().port; + this._port = port2; + f(port2); + }); + }); + } + async close() { + if (this._closed) + return; + this._closed = true; + for (const socket of this._sockets) + socket.destroy(); + this._sockets.clear(); + await new Promise((f) => this._server.close(f)); + } + onSocketRequested(payload) { + if (!this._patternMatcher(payload.host, payload.port)) { + this._handleDirect(payload); + return; + } + this.emit(_SocksProxy.Events.SocksRequested, payload); + } + onSocketData(payload) { + const direct = this._directSockets.get(payload.uid); + if (direct) { + direct.write(payload.data); + return; + } + this.emit(_SocksProxy.Events.SocksData, payload); + } + onSocketClosed(payload) { + const direct = this._directSockets.get(payload.uid); + if (direct) { + direct.destroy(); + this._directSockets.delete(payload.uid); + return; + } + this.emit(_SocksProxy.Events.SocksClosed, payload); + } + socketConnected({ uid, host, port }) { + this._connections.get(uid)?.socketConnected(host, port); + } + socketFailed({ uid, errorCode }) { + this._connections.get(uid)?.socketFailed(errorCode); + } + sendSocketData({ uid, data }) { + this._connections.get(uid)?.sendData(data); + } + sendSocketEnd({ uid }) { + this._connections.get(uid)?.end(); + } + sendSocketError({ uid, error }) { + this._connections.get(uid)?.error(error); + } + }; + SocksProxyHandler = class _SocksProxyHandler extends import_events.default { + constructor(pattern, redirectPortForTest) { + super(); + this._sockets = /* @__PURE__ */ new Map(); + this._patternMatcher = () => false; + this._patternMatcher = parsePattern(pattern); + this._redirectPortForTest = redirectPortForTest; + } + static { + this.Events = { + SocksConnected: "socksConnected", + SocksData: "socksData", + SocksError: "socksError", + SocksFailed: "socksFailed", + SocksEnd: "socksEnd" + }; + } + cleanup() { + for (const uid of this._sockets.keys()) + this.socketClosed({ uid }); + } + async socketRequested({ uid, host, port }) { + debugLogger.log("socks", `[${uid}] => request ${host}:${port}`); + if (!this._patternMatcher(host, port)) { + const payload = { uid, errorCode: "ERULESET" }; + debugLogger.log("socks", `[${uid}] <= pattern error ${payload.errorCode}`); + this.emit(_SocksProxyHandler.Events.SocksFailed, payload); + return; + } + if (host === "local.playwright") + host = "localhost"; + try { + if (this._redirectPortForTest) + port = this._redirectPortForTest; + const socket = await createSocket(host, port); + socket.on("data", (data) => { + const payload2 = { uid, data }; + this.emit(_SocksProxyHandler.Events.SocksData, payload2); + }); + socket.on("error", (error) => { + const payload2 = { uid, error: error.message }; + debugLogger.log("socks", `[${uid}] <= network socket error ${payload2.error}`); + this.emit(_SocksProxyHandler.Events.SocksError, payload2); + this._sockets.delete(uid); + }); + socket.on("end", () => { + const payload2 = { uid }; + debugLogger.log("socks", `[${uid}] <= network socket closed`); + this.emit(_SocksProxyHandler.Events.SocksEnd, payload2); + this._sockets.delete(uid); + }); + const localAddress = socket.localAddress; + const localPort = socket.localPort; + this._sockets.set(uid, socket); + const payload = { uid, host: localAddress, port: localPort }; + debugLogger.log("socks", `[${uid}] <= connected to network ${payload.host}:${payload.port}`); + this.emit(_SocksProxyHandler.Events.SocksConnected, payload); + } catch (error) { + const payload = { uid, errorCode: error.code }; + debugLogger.log("socks", `[${uid}] <= connect error ${payload.errorCode}`); + this.emit(_SocksProxyHandler.Events.SocksFailed, payload); + } + } + sendSocketData({ uid, data }) { + this._sockets.get(uid)?.write(data); + } + socketClosed({ uid }) { + debugLogger.log("socks", `[${uid}] <= browser socket closed`); + this._sockets.get(uid)?.destroy(); + this._sockets.delete(uid); + } + }; + } +}); + +// packages/utils/spawnAsync.ts +function spawnAsync(cmd, args, options = {}) { + const process2 = (0, import_child_process.spawn)(cmd, args, Object.assign({ windowsHide: true }, options)); + return new Promise((resolve) => { + let stdout = ""; + let stderr = ""; + if (process2.stdout) + process2.stdout.on("data", (data) => stdout += data.toString()); + if (process2.stderr) + process2.stderr.on("data", (data) => stderr += data.toString()); + process2.on("close", (code) => resolve({ stdout, stderr, code })); + process2.on("error", (error) => resolve({ stdout, stderr, code: 0, error })); + }); +} +var import_child_process; +var init_spawnAsync = __esm({ + "packages/utils/spawnAsync.ts"() { + "use strict"; + import_child_process = require("child_process"); + } +}); + +// packages/utils/stackTrace.ts +function captureRawStack() { + const stackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = 50; + const error = new Error(); + const stack = error.stack || ""; + Error.stackTraceLimit = stackTraceLimit; + return stack.split("\n"); +} +function parseStackFrame(text2) { + const match = text2 && text2.match(re); + if (!match) + return null; + let fname = match[2]; + let file = match[7]; + if (!file) + return null; + if (!showInternalStackFrames() && (file.startsWith("internal") || file.startsWith("node:"))) + return null; + const line = match[8]; + const column = match[9]; + const closeParen = match[11] === ")"; + const frame = { + file: "", + line: 0, + column: 0 + }; + if (line) + frame.line = Number(line); + if (column) + frame.column = Number(column); + if (closeParen && file) { + let closes = 0; + for (let i = file.length - 1; i > 0; i--) { + if (file.charAt(i) === ")") { + closes++; + } else if (file.charAt(i) === "(" && file.charAt(i - 1) === " ") { + closes--; + if (closes === -1 && file.charAt(i - 1) === " ") { + const before = file.slice(0, i - 1); + const after = file.slice(i + 1); + file = after; + fname += ` (${before}`; + break; + } + } + } + } + if (fname) { + const methodMatch = fname.match(methodRe); + if (methodMatch) + fname = methodMatch[1]; + } + if (file) { + if (file.startsWith("file://")) + file = fileURLToPath(file); + frame.file = file; + } + if (fname) + frame.function = fname; + return frame; +} +function rewriteErrorMessage(e, newMessage) { + const lines = (e.stack?.split("\n") || []).filter((l) => l.startsWith(" at ")); + e.message = newMessage; + const errorTitle = `${e.name}: ${e.message}`; + if (lines.length) + e.stack = `${errorTitle} +${lines.join("\n")}`; + return e; +} +function stringifyStackFrames(frames) { + const stackLines = []; + for (const frame of frames) { + if (frame.function) + stackLines.push(` at ${frame.function} (${frame.file}:${frame.line}:${frame.column})`); + else + stackLines.push(` at ${frame.file}:${frame.line}:${frame.column}`); + } + return stackLines; +} +function splitErrorMessage(message) { + const separationIdx = message.indexOf(":"); + return { + name: separationIdx !== -1 ? message.slice(0, separationIdx) : "", + message: separationIdx !== -1 && separationIdx + 2 <= message.length ? message.substring(separationIdx + 2) : message + }; +} +function parseErrorStack(stack) { + const lines = stack.split("\n"); + let firstStackLine = lines.findIndex((line) => line.startsWith(" at ")); + if (firstStackLine === -1) + firstStackLine = lines.length; + const message = lines.slice(0, firstStackLine).join("\n"); + const stackLines = lines.slice(firstStackLine); + let location2; + for (const line of stackLines) { + const frame = parseStackFrame(line); + if (!frame || !frame.file) + continue; + if (belongsToNodeModules(frame.file)) + continue; + location2 = { file: frame.file, column: frame.column || 0, line: frame.line || 0 }; + break; + } + return { message, stackLines, location: location2 }; +} +function belongsToNodeModules(file) { + return file.includes(`${import_path6.default.sep}node_modules${import_path6.default.sep}`); +} +function filterStackFile(file) { + if (_showInternalStackFrames) + return true; + if (!!_coreDir && file.startsWith(_coreDir)) + return false; + if (_boxedStackPrefixes.some((prefix) => file.startsWith(prefix))) + return false; + if (isUnderTest() && file.match(/[/\\]packages[/\\](playwright|playwright-core|utils|isomorphic|injected)[/\\]/)) + return false; + if (isUnderTest() && file.match(/[/\\]playwright[^/\\]*[/\\]node_modules[/\\]/)) + return false; + return true; +} +function filteredStackTrace(rawStack) { + const frames = []; + for (const line of rawStack) { + const frame = parseStackFrame(line); + if (!frame || !frame.file) + continue; + if (!filterStackFile(frame.file)) + continue; + frames.push(frame); + } + return frames; +} +function fileURLToPath(fileUrl) { + if (!fileUrl.startsWith("file://")) + return fileUrl; + let filePath = decodeURIComponent(fileUrl.slice(7)); + if (filePath.startsWith("/") && /^[a-zA-Z]:/.test(filePath.slice(1))) + filePath = filePath.slice(1); + return filePath.replace(/\//g, import_path6.default.sep); +} +function setCoreDir(dir) { + _coreDir = dir; +} +function coreDir() { + return _coreDir; +} +function setBoxedStackPrefixes(prefixes) { + _boxedStackPrefixes = prefixes; +} +function showInternalStackFrames() { + return _showInternalStackFrames; +} +var import_path6, re, methodRe, _coreDir, _boxedStackPrefixes, _showInternalStackFrames; +var init_stackTrace = __esm({ + "packages/utils/stackTrace.ts"() { + "use strict"; + import_path6 = __toESM(require("path")); + init_env(); + init_debug(); + re = new RegExp( + "^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$" + ); + methodRe = /^(.*?) \[as (.*?)\]$/; + _boxedStackPrefixes = []; + _showInternalStackFrames = getAsBooleanFromENV("PWDEBUGIMPL"); + } +}); + +// packages/utils/stringWidth.ts +function characterWidth(c) { + return getEastAsianWidth.eastAsianWidth(c.codePointAt(0)); +} +function stringWidth(v) { + let width = 0; + for (const { segment } of new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v)) + width += characterWidth(segment); + return width; +} +function suffixOfWidth(v, width) { + const segments = [...new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v)]; + let suffixBegin = v.length; + for (const { segment, index } of segments.reverse()) { + const segmentWidth = stringWidth(segment); + if (segmentWidth > width) + break; + width -= segmentWidth; + suffixBegin = index; + } + return v.substring(suffixBegin); +} +function fitToWidth(line, width, prefix) { + const prefixLength = prefix ? stripAnsiEscapes(prefix).length : 0; + width -= prefixLength; + if (stringWidth(line) <= width) + return line; + const parts = line.split(ansiRegex); + const taken = []; + for (let i = parts.length - 1; i >= 0; i--) { + if (i % 2) { + taken.push(parts[i]); + } else { + let part = suffixOfWidth(parts[i], width); + const wasTruncated = part.length < parts[i].length; + if (wasTruncated && parts[i].length > 0) { + part = "\u2026" + suffixOfWidth(parts[i], width - 1); + } + taken.push(part); + width -= stringWidth(part); + } + } + return taken.reverse().join(""); +} +var getEastAsianWidth; +var init_stringWidth = __esm({ + "packages/utils/stringWidth.ts"() { + "use strict"; + init_stringUtils(); + getEastAsianWidth = require("./utilsBundle").getEastAsianWidth; + } +}); + +// packages/utils/task.ts +function makeWaitForNextTask() { + if (process.versions.electron) + return (callback) => setTimeout(callback, 0); + if (parseInt(process.versions.node, 10) >= 11) + return setImmediate; + let spinning = false; + const callbacks = []; + const loop = () => { + const callback = callbacks.shift(); + if (!callback) { + spinning = false; + return; + } + setImmediate(loop); + callback(); + }; + return (callback) => { + callbacks.push(callback); + if (!spinning) { + spinning = true; + setImmediate(loop); + } + }; +} +var init_task = __esm({ + "packages/utils/task.ts"() { + "use strict"; + } +}); + +// packages/utils/wsServer.ts +var wsServer2, lastConnectionId, kConnectionSymbol, perMessageDeflate, WSServer; +var init_wsServer = __esm({ + "packages/utils/wsServer.ts"() { + "use strict"; + init_httpServer(); + init_network(); + init_debugLogger(); + ({ wsServer: wsServer2 } = require("./utilsBundle")); + lastConnectionId = 0; + kConnectionSymbol = /* @__PURE__ */ Symbol("kConnection"); + perMessageDeflate = { + serverNoContextTakeover: true, + zlibDeflateOptions: { + level: 3 + }, + zlibInflateOptions: { + chunkSize: 10 * 1024 + }, + threshold: 10 * 1024 + }; + WSServer = class { + constructor(delegate) { + // Allowed Host headers for HTTP requests. null disables the check (server bound to a public address). + this._allowedHosts = null; + this._delegate = delegate; + } + async listen(port = 0, hostname, path66) { + debugLogger.log("server", `Server started at ${/* @__PURE__ */ new Date()}`); + hostname ??= "localhost"; + const server = createHttpServer((request2, response2) => this._onRequest(request2, response2)); + server.on("error", (error) => debugLogger.log("server", String(error))); + this.server = server; + const wsEndpoint = await new Promise((resolve, reject) => { + server.listen(port, hostname, () => { + const address = server.address(); + if (!address) { + reject(new Error("Could not bind server socket")); + return; + } + if (typeof address === "string") { + resolve(`${address}${path66}`); + return; + } + this._allowedHosts = computeAllowedHosts(hostname, address.address); + resolve(`ws://${urlHostFromAddress(address)}:${address.port}${path66}`); + }).on("error", reject); + }); + debugLogger.log("server", "Listening at " + wsEndpoint); + this._wsServer = new wsServer2({ + noServer: true, + perMessageDeflate + }); + this._wsServer.on("headers", (headers) => this._delegate.onHeaders(headers)); + server.on("upgrade", (request2, socket, head) => { + const pathname = new URL("http://localhost" + request2.url).pathname; + if (pathname !== path66) { + socket.write(`HTTP/${request2.httpVersion} 400 Bad Request\r +\r +`); + socket.destroy(); + return; + } + if (this._allowedHosts && !this._isAllowedOrigin(request2.headers.origin)) { + socket.write(`HTTP/${request2.httpVersion} 403 Forbidden\r +\r +`); + socket.destroy(); + return; + } + const upgradeResult = this._delegate.onUpgrade(request2, socket); + if (upgradeResult) { + socket.write(upgradeResult.error); + socket.destroy(); + return; + } + this._wsServer.handleUpgrade(request2, socket, head, (ws4) => this._wsServer.emit("connection", ws4, request2)); + }); + this._wsServer.on("connection", (ws4, request2) => { + debugLogger.log("server", "Connected client ws.extension=" + ws4.extensions); + const url3 = new URL("http://localhost" + (request2.url || "")); + const id = String(++lastConnectionId); + debugLogger.log("server", `[${id}] serving connection: ${request2.url}`); + const connection = this._delegate.onConnection(request2, url3, ws4, id); + ws4[kConnectionSymbol] = connection; + }); + return wsEndpoint; + } + _onRequest(request2, response2) { + if (this._allowedHosts) { + const host = request2.headers.host?.toLowerCase(); + const hostname = host ? hostnameFromHostHeader(host) : void 0; + if (!hostname || !this._allowedHosts.has(hostname)) { + response2.statusCode = 403; + response2.end(); + return; + } + } + this._delegate.onRequest(request2, response2); + } + _isAllowedOrigin(origin) { + if (!origin) + return true; + try { + const hostname = new URL(origin).hostname.toLowerCase(); + const bracketed = hostname.includes(":") ? `[${hostname}]` : hostname; + return this._allowedHosts.has(hostname) || this._allowedHosts.has(bracketed); + } catch { + return false; + } + } + async close() { + const server = this._wsServer; + if (!server) + return; + debugLogger.log("server", "closing websocket server"); + const waitForClose = new Promise((f) => server.close(f)); + await Promise.all(Array.from(server.clients).map(async (ws4) => { + const connection = ws4[kConnectionSymbol]; + if (connection) + await connection.close(); + try { + ws4.terminate(); + } catch (e) { + } + })); + await waitForClose; + debugLogger.log("server", "closing http server"); + if (this.server) + await new Promise((f) => this.server.close(f)); + this._wsServer = void 0; + this.server = void 0; + debugLogger.log("server", "closed server"); + } + }; + } +}); + +// packages/utils/zipFile.ts +var yauzl, ZipFile; +var init_zipFile = __esm({ + "packages/utils/zipFile.ts"() { + "use strict"; + yauzl = require("./utilsBundle").yauzl; + ZipFile = class { + constructor(fileName) { + this._entries = /* @__PURE__ */ new Map(); + this._fileName = fileName; + this._openedPromise = this._open(); + } + async _open() { + await new Promise((fulfill, reject) => { + yauzl.open(this._fileName, { autoClose: false }, (e, z32) => { + if (e) { + reject(e); + return; + } + this._zipFile = z32; + this._zipFile.on("entry", (entry) => { + this._entries.set(entry.fileName, entry); + }); + this._zipFile.on("end", fulfill); + }); + }); + } + async entries() { + await this._openedPromise; + return [...this._entries.keys()]; + } + async read(entryPath) { + await this._openedPromise; + const entry = this._entries.get(entryPath); + if (!entry) + throw new Error(`${entryPath} not found in file ${this._fileName}`); + return new Promise((resolve, reject) => { + this._zipFile.openReadStream(entry, (error, readStream) => { + if (error || !readStream) { + reject(error || "Entry not found"); + return; + } + const buffers = []; + readStream.on("data", (data) => buffers.push(data)); + readStream.on("end", () => resolve(Buffer.concat(buffers))); + }); + }); + } + close() { + this._zipFile?.close(); + } + }; + } +}); + +// packages/utils/zones.ts +function currentZone() { + return asyncLocalStorage.getStore() ?? emptyZone; +} +var import_async_hooks, asyncLocalStorage, Zone, emptyZone; +var init_zones = __esm({ + "packages/utils/zones.ts"() { + "use strict"; + import_async_hooks = require("async_hooks"); + asyncLocalStorage = new import_async_hooks.AsyncLocalStorage(); + Zone = class _Zone { + constructor(asyncLocalStorage2, store) { + this._asyncLocalStorage = asyncLocalStorage2; + this._data = store; + } + with(type3, data) { + return new _Zone(this._asyncLocalStorage, new Map(this._data).set(type3, data)); + } + without(type3) { + const data = type3 ? new Map(this._data) : /* @__PURE__ */ new Map(); + data.delete(type3); + return new _Zone(this._asyncLocalStorage, data); + } + run(func) { + return this._asyncLocalStorage.run(this, func); + } + data(type3) { + return this._data.get(type3); + } + }; + emptyZone = new Zone(asyncLocalStorage, /* @__PURE__ */ new Map()); + } +}); + +// packages/utils/third_party/extractZip.ts +async function extractZip(zipPath, opts) { + debug2("creating target directory", opts.dir); + if (!import_path7.default.isAbsolute(opts.dir)) + throw new Error("Target directory is expected to be absolute"); + await import_fs9.promises.mkdir(opts.dir, { recursive: true }); + opts.dir = await import_fs9.promises.realpath(opts.dir); + return new Extractor(zipPath, opts).extract(); +} +var import_fs9, import_path7, import_stream, import_util, debugPkg, getStream, yauzl2, debug2, openZip, pipeline, Extractor; +var init_extractZip = __esm({ + "packages/utils/third_party/extractZip.ts"() { + "use strict"; + import_fs9 = require("fs"); + import_path7 = __toESM(require("path")); + import_stream = __toESM(require("stream")); + import_util = require("util"); + debugPkg = require("./utilsBundle").debug; + getStream = require("./utilsBundle").getStream; + yauzl2 = require("./utilsBundle").yauzl; + debug2 = debugPkg("extract-zip"); + openZip = (0, import_util.promisify)(yauzl2.open); + pipeline = (0, import_util.promisify)(import_stream.default.pipeline); + Extractor = class { + constructor(zipPath, opts) { + this.canceled = false; + this.zipPath = zipPath; + this.opts = opts; + } + async extract() { + debug2("opening", this.zipPath, "with opts", this.opts); + this.zipfile = await openZip(this.zipPath, { lazyEntries: true }); + this.canceled = false; + return new Promise((resolve, reject) => { + this.zipfile.on("error", (err) => { + this.canceled = true; + reject(err); + }); + this.zipfile.readEntry(); + this.zipfile.on("close", () => { + if (!this.canceled) { + debug2("zip extraction complete"); + resolve(); + } + }); + this.zipfile.on("entry", async (entry) => { + if (this.canceled) { + debug2("skipping entry", entry.fileName, { cancelled: this.canceled }); + return; + } + debug2("zipfile entry", entry.fileName); + if (entry.fileName.startsWith("__MACOSX/")) { + this.zipfile.readEntry(); + return; + } + const destDir = import_path7.default.dirname(import_path7.default.join(this.opts.dir, entry.fileName)); + try { + await import_fs9.promises.mkdir(destDir, { recursive: true }); + const canonicalDestDir = await import_fs9.promises.realpath(destDir); + const relativeDestDir = import_path7.default.relative(this.opts.dir, canonicalDestDir); + if (relativeDestDir.split(import_path7.default.sep).includes("..")) + throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`); + await this.extractEntry(entry); + debug2("finished processing", entry.fileName); + this.zipfile.readEntry(); + } catch (err) { + this.canceled = true; + this.zipfile.close(); + reject(err); + } + }); + }); + } + async extractEntry(entry) { + if (this.canceled) { + debug2("skipping entry extraction", entry.fileName, { cancelled: this.canceled }); + return; + } + if (this.opts.onEntry) + this.opts.onEntry(entry, this.zipfile); + const dest = import_path7.default.join(this.opts.dir, entry.fileName); + const mode = entry.externalFileAttributes >> 16 & 65535; + const IFMT = 61440; + const IFDIR = 16384; + const IFLNK = 40960; + const symlink = (mode & IFMT) === IFLNK; + let isDir = (mode & IFMT) === IFDIR; + if (!isDir && entry.fileName.endsWith("/")) + isDir = true; + const madeBy = entry.versionMadeBy >> 8; + if (!isDir) + isDir = madeBy === 0 && entry.externalFileAttributes === 16; + debug2("extracting entry", { filename: entry.fileName, isDir, isSymlink: symlink }); + const procMode = this.getExtractedMode(mode, isDir) & 511; + const destDir = isDir ? dest : import_path7.default.dirname(dest); + const mkdirOptions = { recursive: true }; + if (isDir) + mkdirOptions.mode = procMode; + debug2("mkdir", { dir: destDir, ...mkdirOptions }); + await import_fs9.promises.mkdir(destDir, mkdirOptions); + if (isDir) + return; + debug2("opening read stream", dest); + const readStream = await (0, import_util.promisify)(this.zipfile.openReadStream.bind(this.zipfile))(entry); + if (symlink) { + const link = await getStream(readStream); + debug2("creating symlink", link, dest); + await import_fs9.promises.symlink(link, dest); + } else { + await pipeline(readStream, (0, import_fs9.createWriteStream)(dest, { mode: procMode })); + } + } + getExtractedMode(entryMode, isDir) { + let mode = entryMode; + if (mode === 0) { + if (isDir) { + if (this.opts.defaultDirMode) + mode = Number(this.opts.defaultDirMode); + if (!mode) + mode = 493; + } else { + if (this.opts.defaultFileMode) + mode = Number(this.opts.defaultFileMode); + if (!mode) + mode = 420; + } + } + return mode; + } + }; + } +}); + +// packages/utils/third_party/lockfile.ts +function probe(file, fs72, callback) { + const cachedPrecision = fs72[cacheSymbol]; + if (cachedPrecision) { + return fs72.stat(file, (err, stat) => { + if (err) + return callback(err); + callback(null, stat.mtime, cachedPrecision); + }); + } + const mtime = new Date(Math.ceil(Date.now() / 1e3) * 1e3 + 5); + fs72.utimes(file, mtime, mtime, (err) => { + if (err) + return callback(err); + fs72.stat(file, (err2, stat) => { + if (err2) + return callback(err2); + const precision = stat.mtime.getTime() % 1e3 === 0 ? "s" : "ms"; + Object.defineProperty(fs72, cacheSymbol, { value: precision }); + callback(null, stat.mtime, precision); + }); + }); +} +function getMtime(precision) { + let now = Date.now(); + if (precision === "s") + now = Math.ceil(now / 1e3) * 1e3; + return new Date(now); +} +function getLockFile(file, options) { + return options.lockfilePath || `${file}.lock`; +} +function resolveCanonicalPath(file, options, callback) { + if (!options.realpath) + return callback(null, import_path8.default.resolve(file)); + options.fs.realpath(file, callback); +} +function acquireLock(file, options, callback) { + const lockfilePath = getLockFile(file, options); + options.fs.mkdir(lockfilePath, (err) => { + if (!err) { + return probe(lockfilePath, options.fs, (err2, mtime, mtimePrecision) => { + if (err2) { + options.fs.rmdir(lockfilePath, () => { + }); + return callback(err2); + } + callback(null, mtime, mtimePrecision); + }); + } + if (err.code !== "EEXIST") + return callback(err); + if (options.stale <= 0) + return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file })); + options.fs.stat(lockfilePath, (err2, stat) => { + if (err2) { + if (err2.code === "ENOENT") + return acquireLock(file, { ...options, stale: 0 }, callback); + return callback(err2); + } + if (!isLockStale(stat, options)) + return callback(Object.assign(new Error("Lock file is already being held"), { code: "ELOCKED", file })); + removeLock(file, options, (err3) => { + if (err3) + return callback(err3); + acquireLock(file, { ...options, stale: 0 }, callback); + }); + }); + }); +} +function isLockStale(stat, options) { + return stat.mtime.getTime() < Date.now() - options.stale; +} +function removeLock(file, options, callback) { + options.fs.rmdir(getLockFile(file, options), (err) => { + if (err && err.code !== "ENOENT") + return callback(err); + callback(null); + }); +} +function updateLock(file, options) { + const lock2 = locks[file]; + if (lock2.updateTimeout) + return; + lock2.updateDelay = lock2.updateDelay || options.update; + lock2.updateTimeout = setTimeout(() => { + lock2.updateTimeout = null; + options.fs.stat(lock2.lockfilePath, (err, stat) => { + const isOverThreshold = lock2.lastUpdate + options.stale < Date.now(); + if (err) { + if (err.code === "ENOENT" || isOverThreshold) + return setLockAsCompromised(file, lock2, Object.assign(err, { code: "ECOMPROMISED" })); + lock2.updateDelay = 1e3; + return updateLock(file, options); + } + const isMtimeOurs = lock2.mtime.getTime() === stat.mtime.getTime(); + if (!isMtimeOurs) { + return setLockAsCompromised( + file, + lock2, + Object.assign( + new Error("Unable to update lock within the stale threshold"), + { code: "ECOMPROMISED" } + ) + ); + } + const mtime = getMtime(lock2.mtimePrecision); + options.fs.utimes(lock2.lockfilePath, mtime, mtime, (err2) => { + const isOverThreshold2 = lock2.lastUpdate + options.stale < Date.now(); + if (lock2.released) + return; + if (err2) { + if (err2.code === "ENOENT" || isOverThreshold2) + return setLockAsCompromised(file, lock2, Object.assign(err2, { code: "ECOMPROMISED" })); + lock2.updateDelay = 1e3; + return updateLock(file, options); + } + lock2.mtime = mtime; + lock2.lastUpdate = Date.now(); + lock2.updateDelay = null; + updateLock(file, options); + }); + }); + }, lock2.updateDelay); + if (lock2.updateTimeout && lock2.updateTimeout.unref) + lock2.updateTimeout.unref(); +} +function setLockAsCompromised(file, lock2, err) { + lock2.released = true; + if (lock2.updateTimeout) + clearTimeout(lock2.updateTimeout); + if (locks[file] === lock2) + delete locks[file]; + lock2.options.onCompromised(err); +} +function lockImpl(file, options, callback) { + const resolvedOptions = { + stale: 1e4, + update: null, + realpath: true, + retries: 0, + fs: gracefulFs, + onCompromised: (err) => { + throw err; + }, + ...options + }; + resolvedOptions.retries = resolvedOptions.retries || 0; + resolvedOptions.retries = typeof resolvedOptions.retries === "number" ? { retries: resolvedOptions.retries } : resolvedOptions.retries; + resolvedOptions.stale = Math.max(resolvedOptions.stale || 0, 2e3); + resolvedOptions.update = resolvedOptions.update === null || resolvedOptions.update === void 0 ? resolvedOptions.stale / 2 : resolvedOptions.update || 0; + resolvedOptions.update = Math.max(Math.min(resolvedOptions.update, resolvedOptions.stale / 2), 1e3); + resolveCanonicalPath(file, resolvedOptions, (err, resolvedFile) => { + if (err) + return callback(err); + const canonicalFile = resolvedFile; + const operation = retry.operation(resolvedOptions.retries); + operation.attempt(() => { + acquireLock(canonicalFile, resolvedOptions, (err2, mtime, mtimePrecision) => { + if (operation.retry(err2 || void 0)) + return; + if (err2) + return callback(operation.mainError()); + const lock2 = locks[canonicalFile] = { + lockfilePath: getLockFile(canonicalFile, resolvedOptions), + mtime, + mtimePrecision, + options: resolvedOptions, + lastUpdate: Date.now() + }; + updateLock(canonicalFile, resolvedOptions); + callback(null, (releasedCallback) => { + if (lock2.released) { + return releasedCallback && releasedCallback(Object.assign(new Error("Lock is already released"), { code: "ERELEASED" })); + } + unlock(canonicalFile, { ...resolvedOptions, realpath: false }, releasedCallback || (() => { + })); + }); + }); + }); + }); +} +function unlock(file, options, callback) { + const resolvedOptions = { + stale: 1e4, + update: null, + realpath: true, + retries: 0, + fs: gracefulFs, + onCompromised: (err) => { + throw err; + }, + ...options + }; + resolveCanonicalPath(file, resolvedOptions, (err, resolvedFile) => { + if (err) + return callback(err); + const canonicalFile = resolvedFile; + const lock2 = locks[canonicalFile]; + if (!lock2) + return callback(Object.assign(new Error("Lock is not acquired/owned by you"), { code: "ENOTACQUIRED" })); + if (lock2.updateTimeout) + clearTimeout(lock2.updateTimeout); + lock2.released = true; + delete locks[canonicalFile]; + removeLock(canonicalFile, resolvedOptions, callback); + }); +} +function toPromise(method) { + return (...args) => new Promise((resolve, reject) => { + args.push((err, result2) => { + if (err) + reject(err); + else + resolve(result2); + }); + method(...args); + }); +} +function ensureCleanup() { + if (cleanupInitialized) + return; + cleanupInitialized = true; + onExit(() => { + for (const file in locks) { + const options = locks[file].options; + try { + options.fs.rmdirSync(getLockFile(file, options)); + } catch (e) { + } + } + }); +} +async function lock(file, options) { + ensureCleanup(); + const release = await toPromise(lockImpl)(file, options || {}); + return toPromise(release); +} +var import_path8, gracefulFs, retry, onExit, locks, cacheSymbol, cleanupInitialized; +var init_lockfile = __esm({ + "packages/utils/third_party/lockfile.ts"() { + "use strict"; + import_path8 = __toESM(require("path")); + gracefulFs = require("./utilsBundle").gracefulFs; + retry = require("./utilsBundle").retry; + ({ onExit } = require("./utilsBundle")); + locks = {}; + cacheSymbol = /* @__PURE__ */ Symbol(); + cleanupInitialized = false; + } +}); + +// packages/utils/index.ts +var utils_exports = {}; +__export(utils_exports, { + FastStats: () => FastStats, + HttpServer: () => HttpServer, + ImageChannel: () => ImageChannel, + NET_DEFAULT_TIMEOUT: () => NET_DEFAULT_TIMEOUT, + RecentLogsCollector: () => RecentLogsCollector, + SerializedFS: () => SerializedFS, + SocksProxy: () => SocksProxy, + SocksProxyHandler: () => SocksProxyHandler, + WSServer: () => WSServer, + ZipFile: () => ZipFile, + Zone: () => Zone, + addSuffixToFilePath: () => addSuffixToFilePath, + blendWithWhite: () => blendWithWhite, + calculateSha1: () => calculateSha1, + canAccessFile: () => canAccessFile, + captureRawStack: () => captureRawStack, + colorDeltaE94: () => colorDeltaE94, + compare: () => compare, + compareBuffersOrStrings: () => compareBuffersOrStrings, + computeAllowedHosts: () => computeAllowedHosts, + copyFileAndMakeWritable: () => copyFileAndMakeWritable, + coreDir: () => coreDir, + createGuid: () => createGuid, + createHttp2Server: () => createHttp2Server, + createHttpServer: () => createHttpServer, + createHttpsServer: () => createHttpsServer, + createProxyAgent: () => createProxyAgent, + currentZone: () => currentZone, + debugLogger: () => debugLogger, + debugMode: () => debugMode, + decodeWebp: () => decodeWebp, + decorateServer: () => decorateServer, + defaultUserDataDirForChannel: () => defaultUserDataDirForChannel, + emptyZone: () => emptyZone, + encodeWebp: () => encodeWebp, + envArrayToObject: () => envArrayToObject, + eventsHelper: () => eventsHelper, + existsAsync: () => existsAsync, + extractZip: () => extractZip, + filterStackFile: () => filterStackFile, + filteredStackTrace: () => filteredStackTrace, + fitToWidth: () => fitToWidth, + generateSelfSignedCertificate: () => generateSelfSignedCertificate, + getAsBooleanFromENV: () => getAsBooleanFromENV, + getComparator: () => getComparator, + getFromENV: () => getFromENV, + getPackageManager: () => getPackageManager, + getPackageManagerExecCommand: () => getPackageManagerExecCommand, + gracefullyCloseAll: () => gracefullyCloseAll, + gracefullyCloseSet: () => gracefullyCloseSet, + gracefullyProcessExitDoNotHang: () => gracefullyProcessExitDoNotHang, + guessClientName: () => guessClientName, + hostPlatform: () => hostPlatform, + hostnameFromHostHeader: () => hostnameFromHostHeader, + httpRequest: () => httpRequest, + isChromiumChannelName: () => isChromiumChannelName, + isCodingAgent: () => isCodingAgent, + isLikelyNpxGlobal: () => isLikelyNpxGlobal, + isLosslessWebp: () => isLosslessWebp, + isOfficiallySupportedPlatform: () => isOfficiallySupportedPlatform, + isPathInside: () => isPathInside, + isSystemDirectory: () => isSystemDirectory, + isURLAvailable: () => isURLAvailable, + isUnderTest: () => isUnderTest, + isWritable: () => isWritable, + jsonStringifyForceASCII: () => jsonStringifyForceASCII, + launchProcess: () => launchProcess, + lock: () => lock, + makeSocketPath: () => makeSocketPath, + makeWaitForNextTask: () => makeWaitForNextTask, + mkdirIfNeeded: () => mkdirIfNeeded, + parseErrorStack: () => parseErrorStack, + parsePattern: () => parsePattern, + parseStackFrame: () => parseStackFrame, + perMessageDeflate: () => perMessageDeflate, + removeFolders: () => removeFolders, + resolveWithinRoot: () => resolveWithinRoot, + rewriteErrorMessage: () => rewriteErrorMessage, + rgb2gray: () => rgb2gray, + sanitizeForFilePath: () => sanitizeForFilePath, + serveFolder: () => serveFolder, + setBoxedStackPrefixes: () => setBoxedStackPrefixes, + setCoreDir: () => setCoreDir, + setPlaywrightTestProcessEnv: () => setPlaywrightTestProcessEnv, + shortPlatform: () => shortPlatform, + showInternalStackFrames: () => showInternalStackFrames, + spawnAsync: () => spawnAsync, + splitErrorMessage: () => splitErrorMessage, + srgb2xyz: () => srgb2xyz, + ssim: () => ssim, + startHttpServer: () => startHttpServer, + startProfiling: () => startProfiling, + stopProfiling: () => stopProfiling, + stringWidth: () => stringWidth, + stringifyStackFrames: () => stringifyStackFrames, + throwingResolveWithinRoot: () => throwingResolveWithinRoot, + toPosixPath: () => toPosixPath, + trimLongString: () => trimLongString, + urlHostFromAddress: () => urlHostFromAddress, + wrapInASCIIBox: () => wrapInASCIIBox, + xyz2lab: () => xyz2lab +}); +var init_utils = __esm({ + "packages/utils/index.ts"() { + "use strict"; + init_ascii(); + init_chromiumChannels(); + init_comparators(); + init_crypto(); + init_debug(); + init_webp(); + init_debugLogger(); + init_env(); + init_eventsHelper(); + init_fileUtils(); + init_hostPlatform(); + init_httpServer(); + init_network(); + init_processLauncher(); + init_profiler(); + init_serializedFS(); + init_socksProxy(); + init_spawnAsync(); + init_stackTrace(); + init_stringWidth(); + init_task(); + init_wsServer(); + init_zipFile(); + init_zones(); + init_extractZip(); + init_lockfile(); + init_colorUtils(); + init_compare(); + init_imageChannel(); + init_stats(); + } +}); + +// packages/playwright-core/src/client/eventEmitter.ts +function checkListener(listener) { + if (typeof listener !== "function") + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); +} +function unwrapListener(l) { + return wrappedListener(l) ?? l; +} +function unwrapListeners(arr) { + return arr.map((l) => wrappedListener(l) ?? l); +} +function wrappedListener(l) { + return l.listener; +} +var import_events2, EventEmitter2, OnceWrapper; +var init_eventEmitter = __esm({ + "packages/playwright-core/src/client/eventEmitter.ts"() { + "use strict"; + import_events2 = require("events"); + init_debug(); + EventEmitter2 = class { + constructor() { + this._events = void 0; + this._eventsCount = 0; + this._maxListeners = void 0; + this._pendingHandlers = /* @__PURE__ */ new Map(); + if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || void 0; + this.on = this.addListener; + this.off = this.removeListener; + } + setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || Number.isNaN(n)) + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); + this._maxListeners = n; + return this; + } + getMaxListeners() { + return this._maxListeners === void 0 ? import_events2.EventEmitter.defaultMaxListeners : this._maxListeners; + } + emit(type3, ...args) { + const events = this._events; + if (events === void 0) + return false; + const handler = events?.[type3]; + if (handler === void 0) + return false; + if (typeof handler === "function") { + this._callHandler(type3, handler, args); + } else { + const len = handler.length; + const listeners = handler.slice(); + for (let i = 0; i < len; ++i) + this._callHandler(type3, listeners[i], args); + } + return true; + } + _callHandler(type3, handler, args) { + const promise = Reflect.apply(handler, this, args); + if (!(promise instanceof Promise)) + return; + let set = this._pendingHandlers.get(type3); + if (!set) { + set = /* @__PURE__ */ new Set(); + this._pendingHandlers.set(type3, set); + } + set.add(promise); + promise.catch((e) => { + if (this._rejectionHandler) + this._rejectionHandler(e); + else + throw e; + }).finally(() => set.delete(promise)); + } + addListener(type3, listener) { + return this._addListener(type3, listener, false); + } + on(type3, listener) { + return this._addListener(type3, listener, false); + } + _addListener(type3, listener, prepend) { + checkListener(listener); + let events = this._events; + let existing; + if (events === void 0) { + events = this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else { + if (events.newListener !== void 0) { + this.emit("newListener", type3, unwrapListener(listener)); + events = this._events; + } + existing = events[type3]; + } + if (existing === void 0) { + existing = events[type3] = listener; + ++this._eventsCount; + } else { + if (typeof existing === "function") { + existing = events[type3] = prepend ? [listener, existing] : [existing, listener]; + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + const m = this.getMaxListeners(); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + const w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type3) + " listeners added. Use emitter.setMaxListeners() to increase limit"); + w.name = "MaxListenersExceededWarning"; + w.emitter = this; + w.type = type3; + w.count = existing.length; + if (!isUnderTest()) { + console.warn(w); + } + } + } + return this; + } + prependListener(type3, listener) { + return this._addListener(type3, listener, true); + } + once(type3, listener) { + checkListener(listener); + this.on(type3, new OnceWrapper(this, type3, listener).wrapperFunction); + return this; + } + prependOnceListener(type3, listener) { + checkListener(listener); + this.prependListener(type3, new OnceWrapper(this, type3, listener).wrapperFunction); + return this; + } + removeListener(type3, listener) { + checkListener(listener); + const events = this._events; + if (events === void 0) + return this; + const list = events[type3]; + if (list === void 0) + return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) { + this._events = /* @__PURE__ */ Object.create(null); + } else { + delete events[type3]; + if (events.removeListener) + this.emit("removeListener", type3, list.listener ?? listener); + } + } else if (typeof list !== "function") { + let position = -1; + let originalListener; + for (let i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || wrappedListener(list[i]) === listener) { + originalListener = wrappedListener(list[i]); + position = i; + break; + } + } + if (position < 0) + return this; + if (position === 0) + list.shift(); + else + list.splice(position, 1); + if (list.length === 1) + events[type3] = list[0]; + if (events.removeListener !== void 0) + this.emit("removeListener", type3, originalListener || listener); + } + return this; + } + off(type3, listener) { + return this.removeListener(type3, listener); + } + removeAllListeners(type3, options) { + this._removeAllListeners(type3); + if (!options) + return this; + if (options.behavior === "wait") { + const errors = []; + this._rejectionHandler = (error) => errors.push(error); + return this._waitFor(type3).then(() => { + if (errors.length) + throw errors[0]; + }); + } + if (options.behavior === "ignoreErrors") + this._rejectionHandler = () => { + }; + return Promise.resolve(); + } + _removeAllListeners(type3) { + const events = this._events; + if (!events) + return; + if (!events.removeListener) { + if (type3 === void 0) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else if (events[type3] !== void 0) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else + delete events[type3]; + } + return; + } + if (type3 === void 0) { + const keys = Object.keys(events); + let key; + for (let i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === "removeListener") + continue; + this._removeAllListeners(key); + } + this._removeAllListeners("removeListener"); + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + return; + } + const listeners = events[type3]; + if (typeof listeners === "function") { + this.removeListener(type3, listeners); + } else if (listeners !== void 0) { + for (let i = listeners.length - 1; i >= 0; i--) + this.removeListener(type3, listeners[i]); + } + } + listeners(type3) { + return this._listeners(this, type3, true); + } + rawListeners(type3) { + return this._listeners(this, type3, false); + } + listenerCount(type3) { + const events = this._events; + if (events !== void 0) { + const listener = events[type3]; + if (typeof listener === "function") + return 1; + if (listener !== void 0) + return listener.length; + } + return 0; + } + eventNames() { + return this._eventsCount > 0 && this._events ? Reflect.ownKeys(this._events) : []; + } + async _waitFor(type3) { + let promises2 = []; + if (type3) { + promises2 = [...this._pendingHandlers.get(type3) || []]; + } else { + promises2 = []; + for (const [, pending] of this._pendingHandlers) + promises2.push(...pending); + } + await Promise.all(promises2); + } + _listeners(target, type3, unwrap) { + const events = target._events; + if (events === void 0) + return []; + const listener = events[type3]; + if (listener === void 0) + return []; + if (typeof listener === "function") + return unwrap ? [unwrapListener(listener)] : [listener]; + return unwrap ? unwrapListeners(listener) : listener.slice(); + } + }; + OnceWrapper = class { + constructor(eventEmitter, eventType, listener) { + this._fired = false; + this._eventEmitter = eventEmitter; + this._eventType = eventType; + this._listener = listener; + this.wrapperFunction = this._handle.bind(this); + this.wrapperFunction.listener = listener; + } + _handle(...args) { + if (this._fired) + return; + this._fired = true; + this._eventEmitter.removeListener(this._eventType, this.wrapperFunction); + return this._listener.apply(this._eventEmitter, args); + } + }; + } +}); + +// packages/playwright-core/src/bootstrap.ts +var minimumMajorNodeVersion, currentNodeVersion, major; +var init_bootstrap = __esm({ + "packages/playwright-core/src/bootstrap.ts"() { + "use strict"; + minimumMajorNodeVersion = 20; + currentNodeVersion = process.versions.node; + major = +currentNodeVersion.split(".")[0]; + if (major < minimumMajorNodeVersion) { + console.error( + "You are running Node.js " + currentNodeVersion + `. +Playwright requires Node.js ${minimumMajorNodeVersion} or higher. +Please update your version of Node.js.` + ); + process.exit(1); + } + if (process.env.PW_INSTRUMENT_MODULES) { + const Module = require("module"); + const originalLoad = Module._load; + const root = { name: "", selfMs: 0, totalMs: 0, childrenMs: 0, children: [] }; + let current = root; + const stack = []; + Module._load = function(request2, _parent, _isMain) { + const node = { name: request2, selfMs: 0, totalMs: 0, childrenMs: 0, children: [] }; + current.children.push(node); + stack.push(current); + current = node; + const start3 = performance.now(); + let result2; + try { + result2 = originalLoad.apply(this, arguments); + } catch (e) { + current = stack.pop(); + current.children.pop(); + throw e; + } + const duration = performance.now() - start3; + node.totalMs = duration; + node.selfMs = Math.max(0, duration - node.childrenMs); + current = stack.pop(); + current.childrenMs += duration; + return result2; + }; + process.on("exit", () => { + function printTree(node, prefix, isLast, lines2, depth) { + if (node.totalMs < 1 && depth > 0) + return; + const connector = depth === 0 ? "" : isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 "; + const time = `${node.totalMs.toFixed(1).padStart(8)}ms`; + const self2 = node.children.length ? ` (self: ${node.selfMs.toFixed(1)}ms)` : ""; + lines2.push(`${time} ${prefix}${connector}${node.name}${self2}`); + const childPrefix = prefix + (depth === 0 ? "" : isLast ? " " : "\u2502 "); + const sorted2 = node.children.slice().sort((a, b) => b.totalMs - a.totalMs); + for (let i = 0; i < sorted2.length; i++) + printTree(sorted2[i], childPrefix, i === sorted2.length - 1, lines2, depth + 1); + } + let totalModules = 0; + function count(n) { + totalModules++; + n.children.forEach(count); + } + root.children.forEach(count); + const lines = []; + const sorted = root.children.slice().sort((a, b) => b.totalMs - a.totalMs); + for (let i = 0; i < sorted.length; i++) + printTree(sorted[i], "", i === sorted.length - 1, lines, 0); + const totalMs = root.children.reduce((s, c) => s + c.totalMs, 0); + process.stderr.write(` +--- Module load tree: ${totalModules} modules, ${totalMs.toFixed(0)}ms total --- +` + lines.join("\n") + "\n"); + const flat = /* @__PURE__ */ new Map(); + function gather(n) { + const existing = flat.get(n.name); + if (existing) { + existing.selfMs += n.selfMs; + existing.totalMs += n.totalMs; + existing.count++; + } else { + flat.set(n.name, { selfMs: n.selfMs, totalMs: n.totalMs, count: 1 }); + } + n.children.forEach(gather); + } + root.children.forEach(gather); + const top50 = [...flat.entries()].sort((a, b) => b[1].selfMs - a[1].selfMs).slice(0, 50); + const flatLines = top50.map( + ([mod, { selfMs, totalMs: totalMs2, count: count2 }]) => `${selfMs.toFixed(1).padStart(8)}ms self ${totalMs2.toFixed(1).padStart(8)}ms total (x${String(count2).padStart(3)}) ${mod}` + ); + process.stderr.write(` +--- Top 50 modules by self time --- +` + flatLines.join("\n") + "\n"); + }); + } + } +}); + +// packages/playwright-core/src/package.ts +function libPath(...parts) { + return import_path9.default.join(packageRoot, "lib", ...parts); +} +var import_path9, packageRoot, packageJSON, binPath; +var init_package = __esm({ + "packages/playwright-core/src/package.ts"() { + "use strict"; + import_path9 = __toESM(require("path")); + packageRoot = import_path9.default.join(__dirname, ".."); + packageJSON = require(import_path9.default.join(packageRoot, "package.json")); + binPath = import_path9.default.join(packageRoot, "bin"); + } +}); + +// packages/playwright-core/src/tools/trace/traceParser.ts +async function extractTrace(traceFile, outDir) { + const zipFile = new ZipFile(traceFile); + try { + const entries = await zipFile.entries(); + for (const entry of entries) { + const outPath = resolveWithinRoot(outDir, entry); + if (!outPath) + throw new Error(`Trace entry '${entry}' escapes output directory`); + await import_fs10.default.promises.mkdir(import_path10.default.dirname(outPath), { recursive: true }); + const buffer = await zipFile.read(entry); + await import_fs10.default.promises.writeFile(outPath, buffer); + } + } finally { + zipFile.close(); + } +} +var import_fs10, import_path10, DirTraceLoaderBackend; +var init_traceParser = __esm({ + "packages/playwright-core/src/tools/trace/traceParser.ts"() { + "use strict"; + import_fs10 = __toESM(require("fs")); + import_path10 = __toESM(require("path")); + init_fileUtils(); + init_zipFile(); + DirTraceLoaderBackend = class { + constructor(dir) { + this._dir = dir; + } + isLive() { + return false; + } + async entryNames() { + const entries = []; + const walk = async (dir, prefix) => { + const items = await import_fs10.default.promises.readdir(dir, { withFileTypes: true }); + for (const item of items) { + if (item.isDirectory()) + await walk(import_path10.default.join(dir, item.name), prefix ? `${prefix}/${item.name}` : item.name); + else + entries.push(prefix ? `${prefix}/${item.name}` : item.name); + } + }; + await walk(this._dir, ""); + return entries; + } + async hasEntry(entryName) { + const resolved = resolveWithinRoot(this._dir, entryName); + if (!resolved) + return false; + try { + await import_fs10.default.promises.access(resolved); + return true; + } catch { + return false; + } + } + async readText(entryName) { + const resolved = resolveWithinRoot(this._dir, entryName); + if (!resolved) + return; + try { + return await import_fs10.default.promises.readFile(resolved, "utf-8"); + } catch { + } + } + async readBlob(entryName) { + const resolved = resolveWithinRoot(this._dir, entryName); + if (!resolved) + return; + try { + const buffer = await import_fs10.default.promises.readFile(resolved); + return new Blob([new Uint8Array(buffer)]); + } catch { + } + } + }; + } +}); + +// packages/playwright-core/src/tools/trace/traceUtils.ts +function ensureTraceOpen() { + if (!import_fs11.default.existsSync(traceDir)) + throw new Error(`No trace opened. Run 'npx playwright trace open ' first.`); + return traceDir; +} +async function closeTrace() { + if (import_fs11.default.existsSync(traceDir)) + await import_fs11.default.promises.rm(traceDir, { recursive: true }); +} +async function openTrace(traceFile) { + const filePath = import_path11.default.resolve(traceFile); + if (!import_fs11.default.existsSync(filePath)) + throw new Error(`Trace file not found: ${filePath}`); + await closeTrace(); + await import_fs11.default.promises.mkdir(traceDir, { recursive: true }); + if (filePath.endsWith(".zip")) + await extractTrace(filePath, traceDir); + else + await import_fs11.default.promises.writeFile(import_path11.default.join(traceDir, ".link"), filePath, "utf-8"); +} +async function loadTrace() { + const dir = ensureTraceOpen(); + const linkFile = import_path11.default.join(dir, ".link"); + let traceDir2; + let traceFile; + if (import_fs11.default.existsSync(linkFile)) { + const tracePath = await import_fs11.default.promises.readFile(linkFile, "utf-8"); + traceDir2 = import_path11.default.dirname(tracePath); + traceFile = import_path11.default.basename(tracePath); + } else { + traceDir2 = dir; + } + const backend = new DirTraceLoaderBackend(traceDir2); + const loader = new TraceLoader(); + await loader.load(backend, traceFile); + const model = new TraceModel(traceDir2, loader.contextEntries); + return new LoadedTrace(model, loader, buildOrdinalMap(model)); +} +function formatTimestamp(ms, base) { + const relative = ms - base; + if (relative < 0) + return "0:00.000"; + const totalMs = Math.floor(relative); + const minutes = Math.floor(totalMs / 6e4); + const seconds = Math.floor(totalMs % 6e4 / 1e3); + const millis = totalMs % 1e3; + return `${minutes}:${seconds.toString().padStart(2, "0")}.${millis.toString().padStart(3, "0")}`; +} +function actionTitle(action) { + return renderTitleForCall({ ...action, type: action.class }) || `${action.class}.${action.method}`; +} +async function saveOutputFile(fileName, content, explicitOutput) { + let outFile; + if (explicitOutput) { + outFile = explicitOutput; + } else { + const resolved = resolveWithinRoot(cliOutputDir, fileName); + if (!resolved) + throw new Error(`Attachment name '${fileName}' escapes output directory`); + await import_fs11.default.promises.mkdir(import_path11.default.dirname(resolved), { recursive: true }); + outFile = resolved; + } + await import_fs11.default.promises.writeFile(outFile, content); + return outFile; +} +function buildOrdinalMap(model) { + const actions = model.actions.filter((a) => a.group !== "configuration"); + const { rootItem } = buildActionTree(actions); + const ordinalToCallId = /* @__PURE__ */ new Map(); + const callIdToOrdinal = /* @__PURE__ */ new Map(); + let ordinal = 1; + const visit = (item) => { + ordinalToCallId.set(ordinal, item.action.callId); + callIdToOrdinal.set(item.action.callId, ordinal); + ordinal++; + for (const child of item.children) + visit(child); + }; + for (const child of rootItem.children) + visit(child); + return { ordinalToCallId, callIdToOrdinal }; +} +var import_fs11, import_path11, traceDir, cliOutputDir, LoadedTrace; +var init_traceUtils2 = __esm({ + "packages/playwright-core/src/tools/trace/traceUtils.ts"() { + "use strict"; + import_fs11 = __toESM(require("fs")); + import_path11 = __toESM(require("path")); + init_traceModel(); + init_traceLoader(); + init_protocolFormatter(); + init_fileUtils(); + init_traceParser(); + traceDir = import_path11.default.join(".playwright-cli", "trace"); + cliOutputDir = ".playwright-cli"; + LoadedTrace = class { + constructor(model, loader, ordinals) { + this.model = model; + this.loader = loader; + this.ordinalToCallId = ordinals.ordinalToCallId; + this.callIdToOrdinal = ordinals.callIdToOrdinal; + } + resolveActionId(actionId) { + const ordinal = parseInt(actionId, 10); + if (!isNaN(ordinal)) { + const callId = this.ordinalToCallId.get(ordinal); + if (callId) + return this.model.actions.find((a) => a.callId === callId); + } + return this.model.actions.find((a) => a.callId === actionId); + } + }; + } +}); + +// packages/playwright-core/src/tools/trace/traceOpen.ts +async function traceOpen(traceFile) { + await openTrace(traceFile); + await traceInfo(); +} +async function traceInfo() { + const trace = await loadTrace(); + const model = trace.model; + const info = { + browser: model.browserName || "unknown", + platform: model.platform || "unknown", + playwrightVersion: model.playwrightVersion || "unknown", + title: model.title || "", + duration: msToString(model.endTime - model.startTime), + durationMs: model.endTime - model.startTime, + startTime: model.wallTime ? new Date(model.wallTime).toISOString() : "unknown", + viewport: model.options.viewport ? `${model.options.viewport.width}x${model.options.viewport.height}` : "default", + actions: model.actions.length, + pages: model.pages.length, + network: model.resources.length, + errors: model.errorDescriptors.length, + attachments: model.attachments.length, + consoleMessages: model.events.filter((e) => e.type === "console").length + }; + console.log(""); + console.log(` Browser: ${info.browser}`); + console.log(` Platform: ${info.platform}`); + console.log(` Playwright: ${info.playwrightVersion}`); + if (info.title) + console.log(` Title: ${info.title}`); + console.log(` Duration: ${info.duration}`); + console.log(` Start time: ${info.startTime}`); + console.log(` Viewport: ${info.viewport}`); + console.log(` Actions: ${info.actions}`); + console.log(` Pages: ${info.pages}`); + console.log(` Network: ${info.network} requests`); + console.log(` Errors: ${info.errors}`); + console.log(` Attachments: ${info.attachments}`); + console.log(` Console: ${info.consoleMessages} messages`); + console.log(""); +} +var init_traceOpen = __esm({ + "packages/playwright-core/src/tools/trace/traceOpen.ts"() { + "use strict"; + init_formatUtils(); + init_traceUtils2(); + } +}); + +// packages/playwright-core/src/tools/trace/traceActions.ts +async function traceActions(options) { + const trace = await loadTrace(); + const actions = filterActions(trace.model.actions, options); + const { rootItem } = buildActionTree(actions); + console.log(` ${"#".padStart(4)} ${"Time".padEnd(9)} ${"Action".padEnd(55)} ${"Duration".padStart(8)}`); + console.log(` ${"\u2500".repeat(4)} ${"\u2500".repeat(9)} ${"\u2500".repeat(55)} ${"\u2500".repeat(8)}`); + const visit = (item, indent) => { + const action = item.action; + const ordinal = trace.callIdToOrdinal.get(action.callId) ?? "?"; + const ts = formatTimestamp(action.startTime, trace.model.startTime); + const duration = action.endTime ? msToString(action.endTime - action.startTime) : "running"; + const title = actionTitle(action); + const locator2 = actionLocator(action); + const error = action.error ? " \u2717" : ""; + const prefix = ` ${(ordinal + ".").padStart(4)} ${ts} ${indent}`; + console.log(`${prefix}${title.padEnd(Math.max(1, 55 - indent.length))} ${duration.padStart(8)}${error}`); + if (locator2) + console.log(`${" ".repeat(prefix.length)}${locator2}`); + for (const child of item.children) + visit(child, indent + " "); + }; + for (const child of rootItem.children) + visit(child, ""); +} +function filterActions(actions, options) { + let result2 = actions.filter((a) => a.group !== "configuration"); + if (options.grep) { + const pattern = new RegExp(options.grep, "i"); + result2 = result2.filter((a) => pattern.test(actionTitle(a)) || pattern.test(actionLocator(a) || "")); + } + if (options.errorsOnly) + result2 = result2.filter((a) => !!a.error); + return result2; +} +function actionLocator(action, sdkLanguage) { + return action.params.selector ? asLocatorDescription(sdkLanguage || "javascript", action.params.selector) : void 0; +} +async function traceAction(actionId) { + const trace = await loadTrace(); + const action = trace.resolveActionId(actionId); + if (!action) { + console.error(`Action '${actionId}' not found. Use 'trace actions' to see available action IDs.`); + process.exitCode = 1; + return; + } + const title = actionTitle(action); + console.log(` + ${title} +`); + console.log(" Time"); + console.log(` start: ${formatTimestamp(action.startTime, trace.model.startTime)}`); + const duration = action.endTime ? msToString(action.endTime - action.startTime) : action.error ? "Timed Out" : "Running"; + console.log(` duration: ${duration}`); + const paramKeys = Object.keys(action.params).filter((name) => name !== "info"); + if (paramKeys.length) { + console.log("\n Parameters"); + for (const key of paramKeys) { + const value2 = formatParamValue(action.params[key]); + console.log(` ${key}: ${value2}`); + } + } + if (action.result) { + console.log("\n Return value"); + for (const [key, value2] of Object.entries(action.result)) + console.log(` ${key}: ${formatParamValue(value2)}`); + } + if (action.error) { + console.log("\n Error"); + console.log(` ${action.error.message}`); + } + if (action.log.length) { + console.log("\n Log"); + for (const entry of action.log) { + const time = entry.time !== -1 ? formatTimestamp(entry.time, trace.model.startTime) : ""; + console.log(` ${time.padEnd(12)} ${entry.message}`); + } + } + if (action.stack?.length) { + console.log("\n Source"); + for (const frame of action.stack.slice(0, 5)) { + const file = frame.file.replace(/.*[/\\](.*)/, "$1"); + console.log(` ${file}:${frame.line}:${frame.column}`); + } + } + const snapshots = []; + if (action.beforeSnapshot) + snapshots.push("before"); + if (action.inputSnapshot) + snapshots.push("input"); + if (action.afterSnapshot) + snapshots.push("after"); + if (snapshots.length) { + console.log("\n Snapshots"); + console.log(` available: ${snapshots.join(", ")}`); + console.log(` usage: npx playwright trace snapshot ${actionId} --name <${snapshots.join("|")}>`); + } + console.log(""); +} +function formatParamValue(value2) { + if (value2 === void 0 || value2 === null) + return String(value2); + if (typeof value2 === "string") + return `"${value2}"`; + if (typeof value2 !== "object") + return String(value2); + if (value2.guid) + return ""; + return JSON.stringify(value2).slice(0, 1e3); +} +var init_traceActions = __esm({ + "packages/playwright-core/src/tools/trace/traceActions.ts"() { + "use strict"; + init_traceModel(); + init_locatorGenerators(); + init_formatUtils(); + init_traceUtils2(); + } +}); + +// packages/playwright-core/src/tools/trace/traceRequests.ts +async function traceRequests(options) { + const trace = await loadTrace(); + const model = trace.model; + let indexed = model.resources.map((r, i) => ({ resource: r, ordinal: i + 1 })); + if (options.grep) { + const pattern = new RegExp(options.grep, "i"); + indexed = indexed.filter(({ resource: r }) => pattern.test(r.request.url)); + } + if (options.method) + indexed = indexed.filter(({ resource: r }) => r.request.method.toLowerCase() === options.method.toLowerCase()); + if (options.status) { + const code = parseInt(options.status, 10); + indexed = indexed.filter(({ resource: r }) => r.response.status === code); + } + if (options.failed) + indexed = indexed.filter(({ resource: r }) => r.response.status >= 400 || r.response.status === -1); + if (!indexed.length) { + console.log(" No network requests"); + return; + } + console.log(` ${"#".padStart(4)} ${"Method".padEnd(8)} ${"Status".padEnd(8)} ${"Name".padEnd(45)} ${"Duration".padStart(10)} ${"Size".padStart(8)} ${"Route".padEnd(10)}`); + console.log(` ${"\u2500".repeat(4)} ${"\u2500".repeat(8)} ${"\u2500".repeat(8)} ${"\u2500".repeat(45)} ${"\u2500".repeat(10)} ${"\u2500".repeat(8)} ${"\u2500".repeat(10)}`); + for (const { resource: r, ordinal } of indexed) { + let name; + try { + const url3 = new URL(r.request.url); + name = url3.pathname.substring(url3.pathname.lastIndexOf("/") + 1); + if (!name) + name = url3.host; + if (url3.search) + name += url3.search; + } catch { + name = r.request.url; + } + if (name.length > 45) + name = name.substring(0, 42) + "..."; + const status = r.response.status > 0 ? String(r.response.status) : "ERR"; + const size = r.response._transferSize > 0 ? r.response._transferSize : r.response.bodySize; + const route2 = formatRouteStatus(r); + console.log(` ${(ordinal + ".").padStart(4)} ${r.request.method.padEnd(8)} ${status.padEnd(8)} ${name.padEnd(45)} ${msToString(r.time).padStart(10)} ${bytesToString2(size).padStart(8)} ${route2.padEnd(10)}`); + } +} +async function traceRequest(requestId) { + const trace = await loadTrace(); + const model = trace.model; + const ordinal = parseInt(requestId, 10); + const resource = !isNaN(ordinal) && ordinal >= 1 && ordinal <= model.resources.length ? model.resources[ordinal - 1] : void 0; + if (!resource) { + console.error(`Request '${requestId}' not found. Use 'trace requests' to see available request IDs.`); + process.exitCode = 1; + return; + } + const r = resource; + const status = r.response.status > 0 ? `${r.response.status} ${r.response.statusText}` : "ERR"; + const size = r.response._transferSize > 0 ? r.response._transferSize : r.response.bodySize; + console.log(` + ${r.request.method} ${r.request.url} +`); + console.log(" General"); + console.log(` status: ${status}`); + console.log(` duration: ${msToString(r.time)}`); + console.log(` size: ${bytesToString2(size)}`); + if (r.response.content.mimeType) + console.log(` type: ${r.response.content.mimeType}`); + const route2 = formatRouteStatus(r); + if (route2) + console.log(` route: ${route2}`); + if (r.serverIPAddress) + console.log(` server: ${r.serverIPAddress}${r._serverPort ? ":" + r._serverPort : ""}`); + if (r.response._failureText) + console.log(` error: ${r.response._failureText}`); + if (r.request.headers.length) { + console.log("\n Request headers"); + for (const h of r.request.headers) + console.log(` ${h.name}: ${h.value}`); + } + if (r.request.postData) { + console.log("\n Request body"); + const resource2 = r.request.postData._sha1 ?? r.request.postData._file; + if (resource2) { + console.log(` ${import_path12.default.relative(process.cwd(), import_path12.default.join(trace.model.traceUri, "resources", resource2))}`); + } else { + const text2 = r.request.postData.text.length > 2e3 ? r.request.postData.text.substring(0, 2e3) + "..." : r.request.postData.text; + console.log(` ${text2}`); + } + } + if (r.response.headers.length) { + console.log("\n Response headers"); + for (const h of r.response.headers) + console.log(` ${h.name}: ${h.value}`); + } + if (r.response.bodySize > 0) { + const resource2 = r.response.content._sha1 ?? r.response.content._file; + if (resource2) { + console.log("\n Response body"); + console.log(` ${import_path12.default.relative(process.cwd(), import_path12.default.join(trace.model.traceUri, "resources", resource2))}`); + } else if (r.response.content.text) { + const text2 = r.response.content.text.length > 2e3 ? r.response.content.text.substring(0, 2e3) + "..." : r.response.content.text; + console.log("\n Response body"); + console.log(` ${text2}`); + } + } + if (r._securityDetails) { + console.log("\n Security"); + if (r._securityDetails.protocol) + console.log(` protocol: ${r._securityDetails.protocol}`); + if (r._securityDetails.subjectName) + console.log(` subject: ${r._securityDetails.subjectName}`); + if (r._securityDetails.issuer) + console.log(` issuer: ${r._securityDetails.issuer}`); + } + console.log(""); +} +function bytesToString2(bytes) { + if (bytes < 0 || !isFinite(bytes)) + return "-"; + if (bytes === 0) + return "0"; + if (bytes < 1e3) + return bytes.toFixed(0); + const kb = bytes / 1024; + if (kb < 1e3) + return kb.toFixed(1) + "K"; + const mb = kb / 1024; + if (mb < 1e3) + return mb.toFixed(1) + "M"; + const gb = mb / 1024; + return gb.toFixed(1) + "G"; +} +function formatRouteStatus(r) { + if (r._wasAborted) + return "aborted"; + if (r._wasContinued) + return "continued"; + if (r._wasFulfilled) + return "fulfilled"; + if (r._apiRequest) + return "api"; + return ""; +} +var import_path12; +var init_traceRequests = __esm({ + "packages/playwright-core/src/tools/trace/traceRequests.ts"() { + "use strict"; + import_path12 = __toESM(require("path")); + init_formatUtils(); + init_traceUtils2(); + } +}); + +// packages/playwright-core/src/tools/trace/traceConsole.ts +async function traceConsole(options) { + const trace = await loadTrace(); + const model = trace.model; + const items = []; + for (const event of model.events) { + if (event.type === "console") { + if (options.stdio) + continue; + const level = event.messageType; + if (options.errorsOnly && level !== "error") + continue; + if (options.warnings && level !== "error" && level !== "warning") + continue; + const url3 = event.location.url; + const filename = url3 ? url3.substring(url3.lastIndexOf("/") + 1) : ""; + items.push({ + type: "browser", + level, + text: event.text, + location: `${filename}:${event.location.lineNumber}`, + timestamp: event.time + }); + } + if (event.type === "event" && event.method === "pageError") { + if (options.stdio) + continue; + const error = event.params.error; + items.push({ + type: "browser", + level: "error", + text: error?.error?.message || String(error?.value || ""), + timestamp: event.time + }); + } + } + for (const event of model.stdio) { + if (options.browser) + continue; + if (options.errorsOnly && event.type !== "stderr") + continue; + if (options.warnings && event.type !== "stderr") + continue; + let text2 = ""; + if (event.text) + text2 = event.text.trim(); + if (event.base64) + text2 = Buffer.from(event.base64, "base64").toString("utf-8").trim(); + if (!text2) + continue; + items.push({ + type: event.type, + level: event.type === "stderr" ? "error" : "info", + text: text2, + timestamp: event.timestamp + }); + } + items.sort((a, b) => a.timestamp - b.timestamp); + if (!items.length) { + console.log(" No console entries"); + return; + } + for (const item of items) { + const ts = formatTimestamp(item.timestamp, model.startTime); + const source12 = item.type === "browser" ? "[browser]" : `[${item.type}]`; + const level = item.level.padEnd(8); + const location2 = item.location ? ` ${item.location}` : ""; + console.log(` ${ts} ${source12.padEnd(10)} ${level} ${item.text}${location2}`); + } +} +var init_traceConsole = __esm({ + "packages/playwright-core/src/tools/trace/traceConsole.ts"() { + "use strict"; + init_traceUtils2(); + } +}); + +// packages/playwright-core/src/tools/trace/traceErrors.ts +async function traceErrors() { + const trace = await loadTrace(); + const model = trace.model; + if (!model.errorDescriptors.length) { + console.log(" No errors"); + return; + } + for (const error of model.errorDescriptors) { + if (error.action) { + const title = actionTitle(error.action); + console.log(` + \u2717 ${title}`); + } else { + console.log(` + \u2717 Error`); + } + if (error.stack?.length) { + const frame = error.stack[0]; + const file = frame.file.replace(/.*[/\\](.*)/, "$1"); + console.log(` at ${file}:${frame.line}:${frame.column}`); + } + console.log(""); + const indented = error.message.split("\n").map((l) => ` ${l}`).join("\n"); + console.log(indented); + } + console.log(""); +} +var init_traceErrors = __esm({ + "packages/playwright-core/src/tools/trace/traceErrors.ts"() { + "use strict"; + init_traceUtils2(); + } +}); + +// packages/isomorphic/disposable.ts +async function disposeAll(disposables) { + const copy = [...disposables]; + disposables.length = 0; + await Promise.all(copy.map((d) => d.dispose())); +} +var init_disposable = __esm({ + "packages/isomorphic/disposable.ts"() { + "use strict"; + } +}); + +// packages/playwright-core/src/server/userAgent.ts +function getUserAgent() { + if (cachedUserAgent) + return cachedUserAgent; + try { + cachedUserAgent = determineUserAgent(); + } catch (e) { + cachedUserAgent = "Playwright/unknown"; + } + return cachedUserAgent; +} +function determineUserAgent() { + let osIdentifier = "unknown"; + let osVersion = "unknown"; + if (process.platform === "win32") { + const version3 = import_os4.default.release().split("."); + osIdentifier = "windows"; + osVersion = `${version3[0]}.${version3[1]}`; + } else if (process.platform === "darwin") { + const version3 = (0, import_child_process2.execSync)("sw_vers -productVersion", { stdio: ["ignore", "pipe", "ignore"] }).toString().trim().split("."); + osIdentifier = "macOS"; + osVersion = `${version3[0]}.${version3[1]}`; + } else if (process.platform === "linux") { + const distroInfo = getLinuxDistributionInfoSync(); + if (distroInfo) { + osIdentifier = distroInfo.id || "linux"; + osVersion = distroInfo.version || "unknown"; + } else { + osIdentifier = "linux"; + } + } + const additionalTokens = []; + if (process.env.CI) + additionalTokens.push("CI/1"); + const serializedTokens = additionalTokens.length ? " " + additionalTokens.join(" ") : ""; + const { embedderName, embedderVersion } = getEmbedderName(); + return `Playwright/${getPlaywrightVersion()} (${import_os4.default.arch()}; ${osIdentifier} ${osVersion}) ${embedderName}/${embedderVersion}${serializedTokens}`; +} +function getEmbedderName() { + let embedderName = "unknown"; + let embedderVersion = "unknown"; + if (!process.env.PW_LANG_NAME) { + embedderName = "node"; + embedderVersion = process.version.substring(1).split(".").slice(0, 2).join("."); + } else if (["node", "python", "java", "csharp"].includes(process.env.PW_LANG_NAME)) { + embedderName = process.env.PW_LANG_NAME; + embedderVersion = process.env.PW_LANG_NAME_VERSION ?? "unknown"; + } + return { embedderName, embedderVersion }; +} +function getPlaywrightVersion(majorMinorOnly = false) { + const version3 = process.env.PW_VERSION_OVERRIDE || packageJSON.version; + return majorMinorOnly ? version3.split(".").slice(0, 2).join(".") : version3; +} +var import_child_process2, import_os4, cachedUserAgent; +var init_userAgent = __esm({ + "packages/playwright-core/src/server/userAgent.ts"() { + "use strict"; + import_child_process2 = require("child_process"); + import_os4 = __toESM(require("os")); + init_linuxUtils(); + init_package(); + } +}); + +// packages/playwright-core/src/generated/clockSource.ts +var source; +var init_clockSource = __esm({ + "packages/playwright-core/src/generated/clockSource.ts"() { + "use strict"; + source = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/clock.ts\nvar clock_exports = {};\n__export(clock_exports, {\n ClockController: () => ClockController,\n createClock: () => createClock,\n inject: () => inject,\n install: () => install\n});\nmodule.exports = __toCommonJS(clock_exports);\nvar ClockController = class {\n constructor(embedder) {\n this._duringTick = false;\n this._uniqueTimerId = idCounterStart;\n this.disposables = [];\n this._log = [];\n this._timers = /* @__PURE__ */ new Map();\n this._now = { time: asWallTime(0), isFixedTime: false, ticks: 0, origin: asWallTime(-1) };\n this._embedder = embedder;\n }\n uninstall() {\n this.disposables.forEach((dispose) => dispose());\n this.disposables.length = 0;\n }\n now() {\n this._replayLogOnce();\n this._syncRealTime();\n return this._now.time;\n }\n install(time) {\n this._replayLogOnce();\n this._innerInstall(asWallTime(time));\n }\n setSystemTime(time) {\n this._replayLogOnce();\n this._innerSetTime(asWallTime(time));\n }\n setFixedTime(time) {\n this._replayLogOnce();\n this._innerSetFixedTime(asWallTime(time));\n }\n performanceNow() {\n this._replayLogOnce();\n this._syncRealTime();\n return this._now.ticks;\n }\n _syncRealTime() {\n if (!this._realTime)\n return;\n const now = this._embedder.performanceNow();\n const sinceLastSync = now - this._realTime.lastSyncTicks;\n if (sinceLastSync > 0) {\n this._advanceNow(shiftTicks(this._now.ticks, sinceLastSync));\n this._realTime.lastSyncTicks = now;\n }\n }\n _innerSetTime(time) {\n this._now.time = time;\n this._now.isFixedTime = false;\n if (this._now.origin < 0)\n this._now.origin = this._now.time;\n }\n _innerInstall(time) {\n if (this._now.origin < 0)\n this._now.ticks = 0;\n this._innerSetTime(time);\n }\n _innerSetFixedTime(time) {\n this._innerSetTime(time);\n this._now.isFixedTime = true;\n }\n _advanceNow(to) {\n if (this._now.ticks > to) {\n return;\n }\n if (!this._now.isFixedTime)\n this._now.time = asWallTime(this._now.time + to - this._now.ticks);\n this._now.ticks = to;\n }\n async log(type, time, param) {\n this._log.push({ type, time, param });\n }\n async runFor(ticks) {\n this._replayLogOnce();\n if (ticks < 0)\n throw new TypeError("Negative ticks are not supported");\n await this._runWithDisabledRealTimeSync(async () => {\n await this._runTo(shiftTicks(this._now.ticks, ticks));\n });\n }\n async _runTo(to) {\n to = Math.ceil(to);\n if (this._now.ticks > to)\n return;\n let firstException;\n while (true) {\n const result = await this._callFirstTimer(to);\n if (!result.timerFound)\n break;\n firstException = firstException || result.error;\n }\n this._advanceNow(to);\n if (firstException)\n throw firstException;\n }\n async pauseAt(time) {\n this._replayLogOnce();\n await this._innerPause();\n const toConsume = time - this._now.time;\n await this._innerFastForwardTo(shiftTicks(this._now.ticks, toConsume));\n return toConsume;\n }\n async _innerPause() {\n var _a;\n this._realTime = void 0;\n await ((_a = this._currentRealTimeTimer) == null ? void 0 : _a.dispose());\n this._currentRealTimeTimer = void 0;\n }\n resume() {\n this._replayLogOnce();\n this._innerResume();\n }\n _innerResume() {\n const now = this._embedder.performanceNow();\n this._realTime = { startTicks: now, lastSyncTicks: now };\n this._updateRealTimeTimer();\n }\n _updateRealTimeTimer() {\n var _a;\n if ((_a = this._currentRealTimeTimer) == null ? void 0 : _a.promise) {\n return;\n }\n const firstTimer = this._firstTimer();\n const nextTick = Math.min(firstTimer ? firstTimer.callAt : this._now.ticks + maxTimeout, this._now.ticks + 100);\n const callAt = this._currentRealTimeTimer ? Math.min(this._currentRealTimeTimer.callAt, nextTick) : nextTick;\n if (this._currentRealTimeTimer) {\n this._currentRealTimeTimer.cancel();\n this._currentRealTimeTimer = void 0;\n }\n const realTimeTimer = {\n callAt,\n promise: void 0,\n cancel: this._embedder.setTimeout(() => {\n this._syncRealTime();\n realTimeTimer.promise = this._runTo(this._now.ticks).catch((e) => console.error(e));\n void realTimeTimer.promise.then(() => {\n this._currentRealTimeTimer = void 0;\n if (this._realTime)\n this._updateRealTimeTimer();\n });\n }, callAt - this._now.ticks),\n dispose: async () => {\n realTimeTimer.cancel();\n await realTimeTimer.promise;\n }\n };\n this._currentRealTimeTimer = realTimeTimer;\n }\n async _runWithDisabledRealTimeSync(fn) {\n if (!this._realTime) {\n await fn();\n return;\n }\n await this._innerPause();\n try {\n await fn();\n } finally {\n this._innerResume();\n }\n }\n async fastForward(ticks) {\n this._replayLogOnce();\n await this._runWithDisabledRealTimeSync(async () => {\n await this._innerFastForwardTo(shiftTicks(this._now.ticks, ticks | 0));\n });\n }\n async _innerFastForwardTo(to) {\n if (to < this._now.ticks)\n throw new Error("Cannot fast-forward to the past");\n for (const timer of this._timers.values()) {\n if (to > timer.callAt)\n timer.callAt = to;\n }\n await this._runTo(to);\n }\n addTimer(options) {\n this._replayLogOnce();\n if (options.type === "AnimationFrame" /* AnimationFrame */ && !options.func)\n throw new Error("Callback must be provided to requestAnimationFrame calls");\n if (options.type === "IdleCallback" /* IdleCallback */ && !options.func)\n throw new Error("Callback must be provided to requestIdleCallback calls");\n if (["Timeout" /* Timeout */, "Interval" /* Interval */].includes(options.type) && !options.func && options.delay === void 0)\n throw new Error("Callback must be provided to timer calls");\n let delay = options.delay ? +options.delay : 0;\n if (!Number.isFinite(delay))\n delay = 0;\n delay = delay > maxTimeout ? 1 : delay;\n delay = Math.max(0, delay);\n const timer = {\n type: options.type,\n func: options.func,\n args: options.args || [],\n delay,\n callAt: shiftTicks(this._now.ticks, delay || (this._duringTick ? 1 : 0)),\n createdAt: this._now.ticks,\n id: this._uniqueTimerId++,\n error: new Error()\n };\n this._timers.set(timer.id, timer);\n if (this._realTime)\n this._updateRealTimeTimer();\n return timer.id;\n }\n countTimers() {\n return this._timers.size;\n }\n _firstTimer(beforeTick) {\n let firstTimer = null;\n for (const timer of this._timers.values()) {\n const isInRange = beforeTick === void 0 || timer.callAt <= beforeTick;\n if (isInRange && (!firstTimer || compareTimers(firstTimer, timer) === 1))\n firstTimer = timer;\n }\n return firstTimer;\n }\n _takeFirstTimer(beforeTick) {\n const timer = this._firstTimer(beforeTick);\n if (!timer)\n return null;\n this._advanceNow(timer.callAt);\n if (timer.type === "Interval" /* Interval */)\n timer.callAt = shiftTicks(timer.callAt, timer.delay);\n else\n this._timers.delete(timer.id);\n return timer;\n }\n async _callFirstTimer(beforeTick) {\n const timer = this._takeFirstTimer(beforeTick);\n if (!timer)\n return { timerFound: false };\n this._duringTick = true;\n try {\n if (typeof timer.func !== "function") {\n let error2;\n try {\n (() => {\n globalThis.eval(timer.func);\n })();\n } catch (e) {\n error2 = e;\n }\n await new Promise((f) => this._embedder.setTimeout(f));\n return { timerFound: true, error: error2 };\n }\n let args = timer.args;\n if (timer.type === "AnimationFrame" /* AnimationFrame */)\n args = [this._now.ticks];\n else if (timer.type === "IdleCallback" /* IdleCallback */)\n args = [{ didTimeout: false, timeRemaining: () => 0 }];\n let error;\n try {\n timer.func.apply(null, args);\n } catch (e) {\n error = e;\n }\n await new Promise((f) => this._embedder.setTimeout(f));\n return { timerFound: true, error };\n } finally {\n this._duringTick = false;\n }\n }\n getTimeToNextFrame() {\n this._replayLogOnce();\n return 16 - this._now.ticks % 16;\n }\n clearTimer(timerId, type) {\n this._replayLogOnce();\n if (!timerId) {\n return;\n }\n const id = Number(timerId);\n if (Number.isNaN(id) || id < idCounterStart) {\n const handlerName = getClearHandler(type);\n new Error(`Clock: ${handlerName} was invoked to clear a native timer instead of one created by the clock library.`);\n }\n const timer = this._timers.get(id);\n if (timer) {\n if (timer.type === type || timer.type === "Timeout" && type === "Interval" || timer.type === "Interval" && type === "Timeout") {\n this._timers.delete(id);\n } else {\n const clear = getClearHandler(type);\n const schedule = getScheduleHandler(timer.type);\n throw new Error(\n `Cannot clear timer: timer created with ${schedule}() but cleared with ${clear}()`\n );\n }\n }\n }\n _replayLogOnce() {\n if (!this._log.length)\n return;\n let lastLogTime = -1;\n let isPaused = false;\n for (const { type, time, param } of this._log) {\n if (!isPaused && lastLogTime !== -1)\n this._advanceNow(shiftTicks(this._now.ticks, time - lastLogTime));\n lastLogTime = time;\n if (type === "install") {\n this._innerInstall(asWallTime(param));\n } else if (type === "fastForward" || type === "runFor") {\n this._advanceNow(shiftTicks(this._now.ticks, param));\n } else if (type === "pauseAt") {\n isPaused = true;\n this._innerSetTime(asWallTime(param));\n } else if (type === "resume") {\n isPaused = false;\n } else if (type === "setFixedTime") {\n this._innerSetFixedTime(asWallTime(param));\n } else if (type === "setSystemTime") {\n this._innerSetTime(asWallTime(param));\n }\n }\n if (!isPaused) {\n if (lastLogTime > 0)\n this._advanceNow(shiftTicks(this._now.ticks, this._embedder.dateNow() - lastLogTime));\n this._innerResume();\n } else {\n this._realTime = void 0;\n }\n this._log.length = 0;\n }\n};\nfunction mirrorDateProperties(target, source) {\n for (const prop in source) {\n if (source.hasOwnProperty(prop))\n target[prop] = source[prop];\n }\n target.toString = () => source.toString();\n target.prototype = source.prototype;\n target.parse = source.parse;\n target.UTC = source.UTC;\n target.prototype.toUTCString = source.prototype.toUTCString;\n target.isFake = true;\n return target;\n}\nfunction createDate(clock, NativeDate) {\n function ClockDate(year, month, date, hour, minute, second, ms) {\n if (!(this instanceof ClockDate))\n return new NativeDate(clock.now()).toString();\n switch (arguments.length) {\n case 0:\n return new NativeDate(clock.now());\n case 1:\n return new NativeDate(year);\n case 2:\n return new NativeDate(year, month);\n case 3:\n return new NativeDate(year, month, date);\n case 4:\n return new NativeDate(year, month, date, hour);\n case 5:\n return new NativeDate(year, month, date, hour, minute);\n case 6:\n return new NativeDate(\n year,\n month,\n date,\n hour,\n minute,\n second\n );\n default:\n return new NativeDate(\n year,\n month,\n date,\n hour,\n minute,\n second,\n ms\n );\n }\n }\n ClockDate.now = () => clock.now();\n return mirrorDateProperties(ClockDate, NativeDate);\n}\nfunction createIntl(clock, NativeIntl) {\n const ClockIntl = {};\n for (const key of Object.getOwnPropertyNames(NativeIntl))\n ClockIntl[key] = NativeIntl[key];\n ClockIntl.DateTimeFormat = function(...args) {\n const realFormatter = new NativeIntl.DateTimeFormat(...args);\n const formatter = {\n formatRange: realFormatter.formatRange.bind(realFormatter),\n formatRangeToParts: realFormatter.formatRangeToParts.bind(realFormatter),\n resolvedOptions: realFormatter.resolvedOptions.bind(realFormatter),\n format: (date) => realFormatter.format(date || clock.now()),\n formatToParts: (date) => realFormatter.formatToParts(date || clock.now())\n };\n return formatter;\n };\n ClockIntl.DateTimeFormat.prototype = Object.create(\n NativeIntl.DateTimeFormat.prototype\n );\n ClockIntl.DateTimeFormat.supportedLocalesOf = NativeIntl.DateTimeFormat.supportedLocalesOf;\n return ClockIntl;\n}\nfunction compareTimers(a, b) {\n if (a.callAt < b.callAt)\n return -1;\n if (a.callAt > b.callAt)\n return 1;\n if (a.type === "Immediate" /* Immediate */ && b.type !== "Immediate" /* Immediate */)\n return -1;\n if (a.type !== "Immediate" /* Immediate */ && b.type === "Immediate" /* Immediate */)\n return 1;\n if (a.createdAt < b.createdAt)\n return -1;\n if (a.createdAt > b.createdAt)\n return 1;\n if (a.id < b.id)\n return -1;\n if (a.id > b.id)\n return 1;\n}\nvar maxTimeout = Math.pow(2, 31) - 1;\nvar idCounterStart = 1e12;\nfunction platformOriginals(globalObject) {\n const raw = {\n setTimeout: globalObject.setTimeout,\n clearTimeout: globalObject.clearTimeout,\n setInterval: globalObject.setInterval,\n clearInterval: globalObject.clearInterval,\n requestAnimationFrame: globalObject.requestAnimationFrame ? globalObject.requestAnimationFrame : void 0,\n cancelAnimationFrame: globalObject.cancelAnimationFrame ? globalObject.cancelAnimationFrame : void 0,\n requestIdleCallback: globalObject.requestIdleCallback ? globalObject.requestIdleCallback : void 0,\n cancelIdleCallback: globalObject.cancelIdleCallback ? globalObject.cancelIdleCallback : void 0,\n Date: globalObject.Date,\n performance: globalObject.performance,\n Intl: globalObject.Intl,\n AbortSignal: globalObject.AbortSignal\n };\n const bound = { ...raw };\n for (const key of Object.keys(bound)) {\n if (key !== "Date" && key !== "AbortSignal" && typeof bound[key] === "function")\n bound[key] = bound[key].bind(globalObject);\n }\n return { raw, bound };\n}\nfunction getScheduleHandler(type) {\n if (type === "IdleCallback" || type === "AnimationFrame")\n return `request${type}`;\n return `set${type}`;\n}\nfunction createApi(clock, originals, browserName) {\n return {\n setTimeout: (func, timeout, ...args) => {\n const delay = timeout ? +timeout : timeout;\n return clock.addTimer({\n type: "Timeout" /* Timeout */,\n func,\n args,\n delay\n });\n },\n clearTimeout: (timerId) => {\n if (timerId)\n clock.clearTimer(timerId, "Timeout" /* Timeout */);\n },\n setInterval: (func, timeout, ...args) => {\n const delay = timeout ? +timeout : timeout;\n return clock.addTimer({\n type: "Interval" /* Interval */,\n func,\n args,\n delay\n });\n },\n clearInterval: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "Interval" /* Interval */);\n },\n requestAnimationFrame: (callback) => {\n return clock.addTimer({\n type: "AnimationFrame" /* AnimationFrame */,\n func: callback,\n delay: clock.getTimeToNextFrame()\n });\n },\n cancelAnimationFrame: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "AnimationFrame" /* AnimationFrame */);\n },\n requestIdleCallback: (callback, options) => {\n let timeToNextIdlePeriod = 0;\n if (clock.countTimers() > 0)\n timeToNextIdlePeriod = 50;\n return clock.addTimer({\n type: "IdleCallback" /* IdleCallback */,\n func: callback,\n delay: (options == null ? void 0 : options.timeout) ? Math.min(options == null ? void 0 : options.timeout, timeToNextIdlePeriod) : timeToNextIdlePeriod\n });\n },\n cancelIdleCallback: (timerId) => {\n if (timerId)\n return clock.clearTimer(timerId, "IdleCallback" /* IdleCallback */);\n },\n Intl: originals.Intl ? createIntl(clock, originals.Intl) : void 0,\n Date: createDate(clock, originals.Date),\n performance: originals.performance ? fakePerformance(clock, originals.performance) : void 0,\n AbortSignal: originals.AbortSignal ? fakeAbortSignal(clock, originals.AbortSignal, browserName) : void 0\n };\n}\nfunction getClearHandler(type) {\n if (type === "IdleCallback" || type === "AnimationFrame")\n return `cancel${type}`;\n return `clear${type}`;\n}\nvar FakePerformanceEntry = class {\n constructor(name, entryType, startTime, duration) {\n this.name = name;\n this.entryType = entryType;\n this.startTime = startTime;\n this.duration = duration;\n }\n toJSON() {\n return JSON.stringify({ ...this });\n }\n};\nfunction fakePerformance(clock, performance) {\n const result = {\n now: () => clock.performanceNow()\n };\n result.__defineGetter__("timeOrigin", () => clock._now.origin || 0);\n for (const key of Object.keys(performance.__proto__)) {\n if (key === "now" || key === "timeOrigin")\n continue;\n if (key === "getEntries" || key === "getEntriesByName" || key === "getEntriesByType")\n result[key] = () => [];\n else if (key === "mark")\n result[key] = (name) => new FakePerformanceEntry(name, "mark", 0, 0);\n else if (key === "measure")\n result[key] = (name) => new FakePerformanceEntry(name, "measure", 0, 50);\n else\n result[key] = () => {\n };\n }\n return result;\n}\nfunction fakeAbortSignal(clock, abortSignal, browserName) {\n Object.defineProperty(abortSignal, "timeout", {\n value(ms) {\n const controller = new AbortController();\n clock.addTimer({\n delay: ms,\n type: "Timeout" /* Timeout */,\n func: () => controller.abort(\n new DOMException(\n browserName === "chromium" ? "signal timed out" : "The operation timed out.",\n "TimeoutError"\n )\n )\n });\n return controller.signal;\n }\n });\n return abortSignal;\n}\nfunction createClock(globalObject, config = {}) {\n const originals = platformOriginals(globalObject);\n const embedder = {\n dateNow: () => originals.raw.Date.now(),\n performanceNow: () => Math.ceil(originals.raw.performance.now()),\n setTimeout: (task, timeout) => {\n const timerId = originals.bound.setTimeout(task, timeout);\n return () => originals.bound.clearTimeout(timerId);\n },\n setInterval: (task, delay) => {\n const intervalId = originals.bound.setInterval(task, delay);\n return () => originals.bound.clearInterval(intervalId);\n }\n };\n const clock = new ClockController(embedder);\n const api = createApi(clock, originals.bound, config.browserName);\n return { clock, api, originals: originals.raw };\n}\nfunction install(globalObject, config = {}) {\n var _a, _b;\n if ((_a = globalObject.Date) == null ? void 0 : _a.isFake) {\n throw new TypeError(`Can\'t install fake timers twice on the same global object.`);\n }\n const { clock, api, originals } = createClock(globalObject, config);\n const toFake = ((_b = config.toFake) == null ? void 0 : _b.length) ? config.toFake : Object.keys(originals);\n for (const method of toFake) {\n if (method === "Date") {\n globalObject.Date = mirrorDateProperties(api.Date, globalObject.Date);\n } else if (method === "Intl") {\n globalObject.Intl = api[method];\n } else if (method === "AbortSignal") {\n globalObject.AbortSignal = api[method];\n } else if (method === "performance") {\n globalObject.performance = api[method];\n const kEventTimeStamp = /* @__PURE__ */ Symbol("playwrightEventTimeStamp");\n Object.defineProperty(Event.prototype, "timeStamp", {\n get() {\n var _a2;\n if (!this[kEventTimeStamp])\n this[kEventTimeStamp] = (_a2 = api.performance) == null ? void 0 : _a2.now();\n return this[kEventTimeStamp];\n }\n });\n } else {\n globalObject[method] = (...args) => {\n return api[method].apply(api, args);\n };\n }\n clock.disposables.push(() => {\n globalObject[method] = originals[method];\n });\n }\n return { clock, api, originals };\n}\nfunction inject(globalObject, browserName) {\n const builtins = platformOriginals(globalObject).bound;\n const { clock: controller } = install(globalObject, { browserName });\n controller.resume();\n return {\n controller,\n builtins\n };\n}\nfunction asWallTime(n) {\n return n;\n}\nfunction shiftTicks(ticks, ms) {\n return ticks + ms;\n}\n'; + } +}); + +// packages/protocol/src/serializers.ts +function parseSerializedValue(value2, handles) { + return innerParseSerializedValue(value2, handles, /* @__PURE__ */ new Map(), []); +} +function innerParseSerializedValue(value2, handles, refs, accessChain) { + if (value2.ref !== void 0) + return refs.get(value2.ref); + if (value2.n !== void 0) + return value2.n; + if (value2.s !== void 0) + return value2.s; + if (value2.b !== void 0) + return value2.b; + if (value2.v !== void 0) { + if (value2.v === "undefined") + return void 0; + if (value2.v === "null") + return null; + if (value2.v === "NaN") + return NaN; + if (value2.v === "Infinity") + return Infinity; + if (value2.v === "-Infinity") + return -Infinity; + if (value2.v === "-0") + return -0; + } + if (value2.d !== void 0) + return new Date(value2.d); + if (value2.u !== void 0) + return new URL(value2.u); + if (value2.bi !== void 0) + return BigInt(value2.bi); + if (value2.e !== void 0) { + const error = new Error(value2.e.m); + error.name = value2.e.n; + error.stack = value2.e.s; + return error; + } + if (value2.r !== void 0) + return new RegExp(value2.r.p, value2.r.f); + if (value2.ta !== void 0) { + const ctor = typedArrayKindToConstructor[value2.ta.k]; + return new ctor(value2.ta.b.buffer, value2.ta.b.byteOffset, value2.ta.b.length / ctor.BYTES_PER_ELEMENT); + } + if (value2.a !== void 0) { + const result2 = []; + refs.set(value2.id, result2); + for (let i = 0; i < value2.a.length; i++) + result2.push(innerParseSerializedValue(value2.a[i], handles, refs, [...accessChain, i])); + return result2; + } + if (value2.o !== void 0) { + const result2 = {}; + refs.set(value2.id, result2); + for (const { k, v } of value2.o) + result2[k] = innerParseSerializedValue(v, handles, refs, [...accessChain, k]); + return result2; + } + if (value2.h !== void 0) { + if (handles === void 0) + throw new Error("Unexpected handle"); + return handles[value2.h]; + } + if (value2.fn !== void 0) { + const dummy = () => { + }; + Object.defineProperty(dummy, "name", { value: value2.fn }); + return dummy; + } + throw new Error(`Attempting to deserialize unexpected value${accessChainToDisplayString(accessChain)}: ${value2}`); +} +function serializeValue(value2, handleSerializer) { + return innerSerializeValue(value2, handleSerializer, { lastId: 0, visited: /* @__PURE__ */ new Map() }, []); +} +function innerSerializeValue(value2, handleSerializer, visitorInfo, accessChain) { + const handle = handleSerializer(value2); + if ("fallThrough" in handle) + value2 = handle.fallThrough; + else + return handle; + if (typeof value2 === "symbol") + return { v: "undefined" }; + if (Object.is(value2, void 0)) + return { v: "undefined" }; + if (Object.is(value2, null)) + return { v: "null" }; + if (Object.is(value2, NaN)) + return { v: "NaN" }; + if (Object.is(value2, Infinity)) + return { v: "Infinity" }; + if (Object.is(value2, -Infinity)) + return { v: "-Infinity" }; + if (Object.is(value2, -0)) + return { v: "-0" }; + if (typeof value2 === "boolean") + return { b: value2 }; + if (typeof value2 === "number") + return { n: value2 }; + if (typeof value2 === "string") + return { s: value2 }; + if (typeof value2 === "bigint") + return { bi: value2.toString() }; + if (isError2(value2)) + return { e: { n: value2.name, m: value2.message, s: value2.stack || "" } }; + if (isDate(value2)) + return { d: value2.toJSON() }; + if (isURL(value2)) + return { u: value2.toJSON() }; + if (isRegExp4(value2)) + return { r: { p: value2.source, f: value2.flags } }; + const typedArrayKind = constructorToTypedArrayKind.get(value2.constructor); + if (typedArrayKind) + return { ta: { b: Buffer.from(value2.buffer, value2.byteOffset, value2.byteLength), k: typedArrayKind } }; + const id = visitorInfo.visited.get(value2); + if (id) + return { ref: id }; + if (Array.isArray(value2)) { + const a = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (let i = 0; i < value2.length; ++i) + a.push(innerSerializeValue(value2[i], handleSerializer, visitorInfo, [...accessChain, i])); + return { a, id: id2 }; + } + if (typeof value2 === "object") { + const o = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (const name of Object.keys(value2)) + o.push({ k: name, v: innerSerializeValue(value2[name], handleSerializer, visitorInfo, [...accessChain, name]) }); + return { o, id: id2 }; + } + throw new Error(`Attempting to serialize unexpected value${accessChainToDisplayString(accessChain)}: ${value2}`); +} +function accessChainToDisplayString(accessChain) { + const chainString = accessChain.map((accessor, i) => { + if (typeof accessor === "string") + return i ? `.${accessor}` : accessor; + return `[${accessor}]`; + }).join(""); + return chainString.length > 0 ? ` at position "${chainString}"` : ""; +} +function isRegExp4(obj) { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; +} +function isDate(obj) { + return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]"; +} +function isURL(obj) { + return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]"; +} +function isError2(obj) { + const proto = obj ? Object.getPrototypeOf(obj) : null; + return obj instanceof Error || proto?.name === "Error" || proto && isError2(proto); +} +var typedArrayKindToConstructor, constructorToTypedArrayKind; +var init_serializers = __esm({ + "packages/protocol/src/serializers.ts"() { + "use strict"; + typedArrayKindToConstructor = { + i8: Int8Array, + ui8: Uint8Array, + ui8c: Uint8ClampedArray, + i16: Int16Array, + ui16: Uint16Array, + i32: Int32Array, + ui32: Uint32Array, + f32: Float32Array, + f64: Float64Array, + bi64: BigInt64Array, + bui64: BigUint64Array + }; + constructorToTypedArrayKind = new Map(Object.entries(typedArrayKindToConstructor).map(([k, v]) => [v, k])); + } +}); + +// packages/playwright-core/src/server/errors.ts +function isTargetClosedError(error) { + return error instanceof TargetClosedError || error.name === "TargetClosedError"; +} +function serializeError(e) { + if (isError(e)) + return { error: { message: e.message, stack: e.stack, name: e.name } }; + return { value: serializeValue(e, (value2) => ({ fallThrough: value2 })) }; +} +function parseError(error) { + if (!error.error) { + if (error.value === void 0) + throw new Error("Serialized error must have either an error or a value"); + return parseSerializedValue(error.value, void 0); + } + const e = new Error(error.error.message); + e.stack = error.error.stack || ""; + e.name = error.error.name; + return e; +} +var CustomError, TimeoutError, TargetClosedError, AbortError; +var init_errors = __esm({ + "packages/playwright-core/src/server/errors.ts"() { + "use strict"; + init_rtti(); + init_serializers(); + CustomError = class extends Error { + constructor(message, options) { + super(message, options); + this.name = this.constructor.name; + } + }; + TimeoutError = class extends CustomError { + }; + TargetClosedError = class extends CustomError { + constructor(cause, logs) { + super((cause || "Target page, context or browser has been closed") + (logs || "")); + } + }; + AbortError = class extends CustomError { + constructor(message = "The operation was aborted", options) { + super(message, options); + this.name = "AbortError"; + } + }; + } +}); + +// packages/playwright-core/src/server/progress.ts +function isAbortError(error) { + return error instanceof TimeoutError || !!error[kAbortErrorSymbol]; +} +async function raceUncancellableOperationWithCleanup(progress2, run, cleanup) { + let aborted = false; + try { + return await progress2.race(run().then(async (t) => { + if (aborted) + await cleanup(t); + return t; + })); + } catch (error) { + aborted = true; + throw error; + } +} +var ProgressController, kAbortErrorSymbol, nullProgress; +var init_progress = __esm({ + "packages/playwright-core/src/server/progress.ts"() { + "use strict"; + init_manualPromise(); + init_assert(); + init_time(); + init_debugLogger(); + init_errors(); + ProgressController = class _ProgressController { + constructor(metadata, onCallLog) { + this._forceAbortPromise = new ManualPromise(); + this._donePromise = new ManualPromise(); + this._state = "before"; + this.metadata = metadata || { id: "", startTime: 0, endTime: 0, type: "Internal", method: "", params: {}, log: [], internal: true }; + this._onCallLog = onCallLog; + this._forceAbortPromise.catch((e) => null); + this._controller = new AbortController(); + } + static createForSdkObject(sdkObject, callMetadata) { + const logName = sdkObject.logName || "api"; + return new _ProgressController(callMetadata, (message) => { + if (logName === "api" && sdkObject.attribution.playwright?.options.isInternalPlaywright) + return; + debugLogger.log(logName, message); + sdkObject.instrumentation.onCallLog(sdkObject, callMetadata, logName, message); + }); + } + async abort(error) { + const logMessage = `operation was aborted: ${error.message}`; + if (this._state === "running") { + this.metadata.log.push(logMessage); + error[kAbortErrorSymbol] = true; + this._state = { error }; + this._forceAbortPromise.reject(error); + this._controller.abort(error); + } else if (this._state === "before") { + this.metadata.log.push(logMessage); + error[kAbortErrorSymbol] = true; + this._pendingAbortError = error; + } + await this._donePromise; + } + async run(task, timeout) { + const deadline = timeout ? monotonicTime() + timeout : 0; + assert(this._state === "before"); + this._state = "running"; + let timer; + let outerProgress; + let allowConcurrent = false; + const progress2 = { + timeout: timeout ?? 0, + deadline, + disableTimeout: () => { + clearTimeout(timer); + }, + log: (message) => { + if (this._state === "running") + this.metadata.log.push(message); + this._onCallLog?.(message); + }, + metadata: this.metadata, + setAllowConcurrentOrNestedRaces: (allow) => { + allowConcurrent = allow; + }, + race: (promise) => { + if (process.env.PW_DETECT_NESTED_PROGRESS) { + const innerProgress = new Error().stack; + if (outerProgress && !allowConcurrent && outerProgress !== innerProgress) { + console.error("Cannot call race() inside another race()"); + console.error("<<<<>>>>:", outerProgress); + console.error("<<<<>>>>:", innerProgress); + } + outerProgress = innerProgress; + } + const promises2 = Array.isArray(promise) ? promise : [promise]; + if (!promises2.length) + return Promise.resolve(); + return Promise.race([...promises2, this._forceAbortPromise]).finally(() => outerProgress = void 0); + }, + wait: async (timeout2) => { + let timer2; + const promise = new Promise((f) => timer2 = setTimeout(f, timeout2)); + return progress2.race(promise).finally(() => clearTimeout(timer2)); + }, + signal: this._controller.signal + }; + if (deadline) { + const timeoutError = new TimeoutError(`Timeout ${timeout}ms exceeded.`); + timer = setTimeout(() => { + if (this.metadata.pauseStartTime && !this.metadata.pauseEndTime) + return; + if (this._state === "running") { + this._state = { error: timeoutError }; + this._forceAbortPromise.reject(timeoutError); + this._controller.abort(timeoutError); + } + }, deadline - monotonicTime()); + } + try { + if (this._pendingAbortError) + throw this._pendingAbortError; + const result2 = await task(progress2); + this._state = "finished"; + return result2; + } catch (error) { + this._state = { error }; + throw error; + } finally { + clearTimeout(timer); + this._donePromise.resolve(); + } + } + }; + kAbortErrorSymbol = /* @__PURE__ */ Symbol("kAbortError"); + nullProgress = { + timeout: 0, + deadline: 0, + disableTimeout() { + }, + log() { + }, + race(promise) { + const promises2 = Array.isArray(promise) ? promise : [promise]; + return Promise.race(promises2); + }, + wait: async (timeout) => await new Promise((f) => setTimeout(f, timeout)), + signal: new AbortController().signal, + metadata: { + id: "", + startTime: 0, + endTime: 0, + type: "", + method: "", + params: {}, + log: [], + internal: true + }, + setAllowConcurrentOrNestedRaces() { + } + }; + } +}); + +// packages/playwright-core/src/server/clock.ts +function parseTicks(value2) { + if (typeof value2 === "number") + return value2; + if (!value2) + return 0; + const str = value2; + const strings = str.split(":"); + const l = strings.length; + let i = l; + let ms = 0; + let parsed; + if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { + throw new Error( + `Clock only understands numbers, 'mm:ss' and 'hh:mm:ss'` + ); + } + while (i--) { + parsed = parseInt(strings[i], 10); + if (parsed >= 60) + throw new Error(`Invalid time ${str}`); + ms += parsed * Math.pow(60, l - i - 1); + } + return ms * 1e3; +} +function parseTime(epoch) { + if (!epoch) + return 0; + const parsed = new Date(epoch); + if (!isFinite(parsed.getTime())) + throw new Error(`Invalid date: ${epoch}`); + return typeof epoch === "number" ? epoch : parsed.getTime(); +} +var Clock; +var init_clock = __esm({ + "packages/playwright-core/src/server/clock.ts"() { + "use strict"; + init_clockSource(); + init_progress(); + Clock = class { + constructor(browserContext) { + this._initScripts = []; + this._browserContext = browserContext; + } + async uninstall(progress2) { + await progress2.race(Promise.all(this._initScripts.map((script) => script.dispose()))); + this._initScripts = []; + } + async fastForward(ticks) { + await this._installIfNeeded(); + const ticksMillis = parseTicks(ticks); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('fastForward', ${Date.now()}, ${ticksMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.fastForward(${ticksMillis})`); + } + async install(time) { + await this._installIfNeeded(); + const timeMillis = time !== void 0 ? parseTime(time) : Date.now(); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('install', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.install(${timeMillis})`); + } + async pauseAt(ticks) { + await this._installIfNeeded(); + const timeMillis = parseTime(ticks); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('pauseAt', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.pauseAt(${timeMillis})`); + } + resumeNoReply() { + if (!this._initScripts.length) + return; + const doResume = async () => { + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`); + }; + doResume().catch(() => { + }); + } + async resume(progress2) { + await progress2.race(this._installIfNeeded()); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('resume', ${Date.now()})`)); + await progress2.race(this._evaluateInFrames(`globalThis.__pwClock.controller.resume()`)); + } + async setFixedTime(time) { + await this._installIfNeeded(); + const timeMillis = parseTime(time); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('setFixedTime', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.setFixedTime(${timeMillis})`); + } + async setSystemTime(time) { + await this._installIfNeeded(); + const timeMillis = parseTime(time); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('setSystemTime', ${Date.now()}, ${timeMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.setSystemTime(${timeMillis})`); + } + async runFor(ticks) { + await this._installIfNeeded(); + const ticksMillis = parseTicks(ticks); + this._initScripts.push(await this._browserContext.addInitScript(nullProgress, `globalThis.__pwClock.controller.log('runFor', ${Date.now()}, ${ticksMillis})`)); + await this._evaluateInFrames(`globalThis.__pwClock.controller.runFor(${ticksMillis})`); + } + async _installIfNeeded() { + if (this._initScripts.length) + return; + const script = `(() => { + const module = {}; + ${source} + if (!globalThis.__pwClock) + globalThis.__pwClock = (module.exports.inject())(globalThis, ${JSON.stringify(this._browserContext._browser.options.name)}); + })();`; + const initScript = await this._browserContext.addInitScript(nullProgress, script); + await this._evaluateInFrames(script); + this._initScripts.push(initScript); + } + async _evaluateInFrames(script) { + await this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: true }); + } + }; + } +}); + +// packages/playwright-core/src/generated/webAuthnSource.ts +var source2; +var init_webAuthnSource = __esm({ + "packages/playwright-core/src/generated/webAuthnSource.ts"() { + "use strict"; + source2 = ` +var __commonJS = obj => { + let required = false; + let result; + return function __require() { + if (!required) { + required = true; + let fn; + for (const name in obj) { fn = obj[name]; break; } + const module = { exports: {} }; + fn(module.exports, module); + result = module.exports; + } + return result; + } +}; +var __export = (target, all) => {for (var name in all) target[name] = all[name];}; +var __toESM = mod => ({ ...mod, 'default': mod }); +var __toCommonJS = mod => ({ ...mod, __esModule: true }); + + +// packages/injected/src/webAuthn.ts +var webAuthn_exports = {}; +__export(webAuthn_exports, { + inject: () => inject +}); +module.exports = __toCommonJS(webAuthn_exports); +function inject(globalThis) { + if (globalThis.__pwWebAuthnInstalled) + return; + globalThis.__pwWebAuthnInstalled = true; + const binding = globalThis.__pwWebAuthnBinding; + if (!binding || !globalThis.navigator) + return; + if (!globalThis.navigator.credentials) { + Object.defineProperty(globalThis.navigator, "credentials", { + value: { create: async () => null, get: async () => null }, + writable: true, + configurable: true + }); + } + function toBase64Url(buf) { + const bytes = buf instanceof ArrayBuffer ? new Uint8Array(buf) : new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + let s = ""; + for (let i = 0; i < bytes.length; i++) + s += String.fromCharCode(bytes[i]); + return globalThis.btoa(s).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", ""); + } + function fromBase64Url(s) { + let str = s.replaceAll("-", "+").replaceAll("_", "/"); + while (str.length % 4) + str += "="; + const bin = globalThis.atob(str); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) + out[i] = bin.charCodeAt(i); + return out.buffer; + } + const PublicKeyCredentialCtor = globalThis.PublicKeyCredential; + const AuthAttestationResponseCtor = globalThis.AuthenticatorAttestationResponse; + const AuthAssertionResponseCtor = globalThis.AuthenticatorAssertionResponse; + function defineReadonly(target, props) { + for (const k of Object.keys(props)) + Object.defineProperty(target, k, { value: props[k], enumerable: true, configurable: true }); + } + function makeAttestationResponse(clientDataJSON, attestationObject) { + const proto = (AuthAttestationResponseCtor == null ? void 0 : AuthAttestationResponseCtor.prototype) || Object.prototype; + const r = Object.create(proto); + defineReadonly(r, { clientDataJSON, attestationObject }); + r.getTransports = () => ["internal"]; + r.getAuthenticatorData = () => { + return attestationObject; + }; + r.getPublicKey = () => null; + r.getPublicKeyAlgorithm = () => -7; + return r; + } + function makeAssertionResponse(clientDataJSON, authenticatorData, signature, userHandle) { + const proto = (AuthAssertionResponseCtor == null ? void 0 : AuthAssertionResponseCtor.prototype) || Object.prototype; + const r = Object.create(proto); + defineReadonly(r, { clientDataJSON, authenticatorData, signature, userHandle }); + return r; + } + function makePublicKeyCredential(id, response) { + const proto = (PublicKeyCredentialCtor == null ? void 0 : PublicKeyCredentialCtor.prototype) || Object.prototype; + const cred = Object.create(proto); + defineReadonly(cred, { + id, + rawId: fromBase64Url(id), + type: "public-key", + authenticatorAttachment: "platform", + response + }); + cred.getClientExtensionResults = () => ({}); + cred.toJSON = () => ({ id, rawId: id, type: "public-key", response: {} }); + return cred; + } + function toBuf(x) { + if (!x) + return new ArrayBuffer(0); + if (x instanceof ArrayBuffer) + return x; + const v = x; + const out = new Uint8Array(v.byteLength); + out.set(new Uint8Array(v.buffer, v.byteOffset, v.byteLength)); + return out.buffer; + } + function failure(name, message) { + const Ctor = globalThis.DOMException || Error; + throw new Ctor(message, name); + } + const origCreate = globalThis.navigator.credentials.create.bind(globalThis.navigator.credentials); + const origGet = globalThis.navigator.credentials.get.bind(globalThis.navigator.credentials); + globalThis.navigator.credentials.create = async function(options) { + var _a, _b, _c, _d, _e, _f, _g; + if (!options || !options.publicKey) + return origCreate(options); + const pk = options.publicKey; + const req = { + type: "create", + origin: globalThis.location.origin, + challenge: toBase64Url(toBuf(pk.challenge)), + rp: { id: (_a = pk.rp) == null ? void 0 : _a.id, name: ((_b = pk.rp) == null ? void 0 : _b.name) || "" }, + user: { + id: toBase64Url(toBuf((_c = pk.user) == null ? void 0 : _c.id)), + name: ((_d = pk.user) == null ? void 0 : _d.name) || "", + displayName: ((_e = pk.user) == null ? void 0 : _e.displayName) || "" + }, + pubKeyCredParams: (pk.pubKeyCredParams || []).map((p) => ({ type: p.type, alg: p.alg })), + excludeCredentials: (pk.excludeCredentials || []).map((c) => ({ type: c.type, id: toBase64Url(toBuf(c.id)) })), + userVerification: (_f = pk.authenticatorSelection) == null ? void 0 : _f.userVerification, + residentKey: (_g = pk.authenticatorSelection) == null ? void 0 : _g.residentKey + }; + const result = await binding(req); + if (!result.ok) + failure(result.name, result.message); + const resp = makeAttestationResponse(fromBase64Url(result.clientDataJSON), fromBase64Url(result.attestationObject)); + return makePublicKeyCredential(result.id, resp); + }; + globalThis.navigator.credentials.get = async function(options) { + if (!options || !options.publicKey) + return origGet(options); + const pk = options.publicKey; + const req = { + type: "get", + origin: globalThis.location.origin, + challenge: toBase64Url(toBuf(pk.challenge)), + rpId: pk.rpId || new URL(globalThis.location.origin).hostname, + allowCredentials: (pk.allowCredentials || []).map((c) => ({ type: c.type, id: toBase64Url(toBuf(c.id)) })), + userVerification: pk.userVerification + }; + const result = await binding(req); + if (!result.ok) + failure(result.name, result.message); + const resp = makeAssertionResponse( + fromBase64Url(result.clientDataJSON), + fromBase64Url(result.authenticatorData), + fromBase64Url(result.signature), + result.userHandle ? fromBase64Url(result.userHandle) : null + ); + return makePublicKeyCredential(result.id, resp); + }; + if (PublicKeyCredentialCtor) { + PublicKeyCredentialCtor.isUserVerifyingPlatformAuthenticatorAvailable = async () => true; + PublicKeyCredentialCtor.isConditionalMediationAvailable = async () => true; + } +} +`; + } +}); + +// packages/playwright-core/src/server/credentials.ts +function toPublic(r) { + return { id: r.id, rpId: r.rpId, userHandle: r.userHandle, privateKey: r.privateKey, publicKey: r.publicKey }; +} +function randomBase64Url(bytes) { + return bufToB64Url(import_crypto5.default.randomBytes(bytes)); +} +function bufToB64Url(b) { + return b.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", ""); +} +function b64UrlToBuf(s) { + return Buffer.from(s, "base64url"); +} +function u32ToBytes(n) { + const b = Buffer.alloc(4); + b.writeUInt32BE(n >>> 0, 0); + return b; +} +function cborHead(major2, value2) { + const m = major2 << 5; + if (value2 < 24) + return Buffer.from([m | value2]); + if (value2 < 256) + return Buffer.from([m | 24, value2]); + if (value2 < 65536) + return Buffer.from([m | 25, value2 >> 8 & 255, value2 & 255]); + return Buffer.from([m | 26, value2 >>> 24 & 255, value2 >> 16 & 255, value2 >> 8 & 255, value2 & 255]); +} +function cborUint(v) { + return cborHead(0, v); +} +function cborNint(v) { + return cborHead(1, -1 - v); +} +function cborBytes(b) { + return Buffer.concat([cborHead(2, b.length), b]); +} +function cborText(s) { + const b = Buffer.from(s, "utf8"); + return Buffer.concat([cborHead(3, b.length), b]); +} +function cborMap(entries) { + return Buffer.concat([cborHead(5, entries.length), ...entries.flatMap(([k, v]) => [k, v])]); +} +function encodeCoseEs256PublicKey(publicKey) { + const jwk = publicKey.export({ format: "jwk" }); + const x = Buffer.from(jwk.x, "base64url"); + const y = Buffer.from(jwk.y, "base64url"); + return cborMap([ + [cborUint(1), cborUint(2)], + // kty = EC2 + [cborUint(3), cborNint(-7)], + // alg = ES256 + [cborNint(-1), cborUint(1)], + // crv = P-256 + [cborNint(-2), cborBytes(x)], + [cborNint(-3), cborBytes(y)] + ]); +} +function encodeAttestationObjectNone(authData) { + return cborMap([ + [cborText("fmt"), cborText("none")], + [cborText("attStmt"), cborMap([])], + [cborText("authData"), cborBytes(authData)] + ]); +} +var import_crypto5, kBindingName, kAuthenticatorAAGUID, Credentials; +var init_credentials = __esm({ + "packages/playwright-core/src/server/credentials.ts"() { + "use strict"; + import_crypto5 = __toESM(require("crypto")); + init_webAuthnSource(); + init_progress(); + kBindingName = "__pwWebAuthnBinding"; + kAuthenticatorAAGUID = Buffer.alloc(16); + Credentials = class { + constructor(browserContext) { + this._registry = /* @__PURE__ */ new Map(); + this._browserContext = browserContext; + } + async create(options) { + let privateKey = options.privateKey; + let publicKey = options.publicKey; + if (!privateKey || !publicKey) { + const pair = import_crypto5.default.generateKeyPairSync("ec", { namedCurve: "P-256" }); + privateKey = bufToB64Url(pair.privateKey.export({ format: "der", type: "pkcs8" })); + publicKey = bufToB64Url(pair.publicKey.export({ format: "der", type: "spki" })); + } + const record = { + id: options.id || randomBase64Url(16), + rpId: options.rpId, + userHandle: options.userHandle || randomBase64Url(16), + privateKey, + publicKey, + signCount: 0, + isResident: true + }; + this._registry.set(record.id, record); + return toPublic(record); + } + async get(filter) { + return [...this._registry.values()].filter((c) => { + if (filter?.rpId && c.rpId !== filter.rpId) + return false; + if (filter?.id && c.id !== filter.id) + return false; + return true; + }).map(toPublic); + } + async delete(id) { + this._registry.delete(id); + } + clear() { + this._registry.clear(); + } + async dispose(progress2) { + if (this._initScript) { + await progress2.race(this._initScript.dispose()); + this._initScript = void 0; + } + if (this._binding) { + await progress2.race(this._binding.dispose()); + this._binding = void 0; + } + this._registry.clear(); + } + async install(progress2) { + if (this._binding) + return; + this._binding = await this._browserContext.exposeBinding(progress2, kBindingName, async (_source, payload) => { + try { + if (payload?.type === "create") + return await this._handleCreate(payload); + if (payload?.type === "get") + return this._handleGet(payload); + } catch (e) { + return { ok: false, name: "NotAllowedError", message: e.message }; + } + return { ok: false, name: "NotAllowedError", message: "Unknown WebAuthn request" }; + }); + const script = `(() => { + const module = {}; + ${source2} + module.exports.inject()(globalThis); + })();`; + this._initScript = await this._browserContext.addInitScript(nullProgress, script); + await progress2.race(this._browserContext.safeNonStallingEvaluateInAllFrames(script, "main", { throwOnJSErrors: false })); + } + async _handleCreate(req) { + const rpId = req.rp?.id || new URL(req.origin).hostname; + const userHandle = req.user.id; + if (req.excludeCredentials?.length) { + for (const desc of req.excludeCredentials) { + if (this._registry.has(desc.id)) + return { ok: false, name: "InvalidStateError", message: "Credential excluded" }; + } + } + const pair = import_crypto5.default.generateKeyPairSync("ec", { namedCurve: "P-256" }); + const privateKey = bufToB64Url(pair.privateKey.export({ format: "der", type: "pkcs8" })); + const publicKey = bufToB64Url(pair.publicKey.export({ format: "der", type: "spki" })); + const credentialId = import_crypto5.default.randomBytes(16); + const credentialIdB64 = bufToB64Url(credentialId); + const record = { + id: credentialIdB64, + rpId, + userHandle, + privateKey, + publicKey, + signCount: 0, + isResident: req.residentKey === "required" || req.residentKey === "preferred" + }; + this._registry.set(credentialIdB64, record); + const clientDataJSON = Buffer.from(JSON.stringify({ + type: "webauthn.create", + challenge: req.challenge, + origin: req.origin, + crossOrigin: false + })); + const rpIdHash = import_crypto5.default.createHash("sha256").update(rpId).digest(); + const flags = 1 | 4 | 64; + const signCountBuf = u32ToBytes(record.signCount); + const cosePublicKey = encodeCoseEs256PublicKey(pair.publicKey); + const credIdLenBuf = Buffer.from([credentialId.length >> 8 & 255, credentialId.length & 255]); + const attestedCredentialData = Buffer.concat([kAuthenticatorAAGUID, credIdLenBuf, credentialId, cosePublicKey]); + const authData = Buffer.concat([rpIdHash, Buffer.from([flags]), signCountBuf, attestedCredentialData]); + const attestationObject = encodeAttestationObjectNone(authData); + return { + ok: true, + id: credentialIdB64, + clientDataJSON: bufToB64Url(clientDataJSON), + attestationObject: bufToB64Url(attestationObject) + }; + } + _handleGet(req) { + const rpId = req.rpId || new URL(req.origin).hostname; + let candidate; + if (req.allowCredentials?.length) { + for (const desc of req.allowCredentials) { + const c = this._registry.get(desc.id); + if (c && c.rpId === rpId) { + candidate = c; + break; + } + } + } else { + for (const c of this._registry.values()) { + if (c.rpId === rpId && c.isResident) { + candidate = c; + break; + } + } + } + if (!candidate) + return { ok: false, name: "NotAllowedError", message: "No matching credential" }; + const clientDataJSON = Buffer.from(JSON.stringify({ + type: "webauthn.get", + challenge: req.challenge, + origin: req.origin, + crossOrigin: false + })); + const rpIdHash = import_crypto5.default.createHash("sha256").update(rpId).digest(); + const flags = 1 | 4; + candidate.signCount += 1; + const signCountBuf = u32ToBytes(candidate.signCount); + const authData = Buffer.concat([rpIdHash, Buffer.from([flags]), signCountBuf]); + const clientDataHash = import_crypto5.default.createHash("sha256").update(clientDataJSON).digest(); + const toSign = Buffer.concat([authData, clientDataHash]); + const privateKey = import_crypto5.default.createPrivateKey({ key: b64UrlToBuf(candidate.privateKey), format: "der", type: "pkcs8" }); + const signature = import_crypto5.default.sign("sha256", toSign, privateKey); + return { + ok: true, + id: candidate.id, + clientDataJSON: bufToB64Url(clientDataJSON), + authenticatorData: bufToB64Url(authData), + signature: bufToB64Url(signature), + userHandle: candidate.userHandle || null + }; + } + }; + } +}); + +// packages/playwright-core/src/server/instrumentation.ts +function createRootSdkObject() { + const fakeParent = { attribution: {}, instrumentation: createInstrumentation() }; + const root = new SdkObject(fakeParent); + root.guid = ""; + return root; +} +function createInstrumentation() { + const listeners = /* @__PURE__ */ new Map(); + const lastListeners = /* @__PURE__ */ new Map(); + return new Proxy({}, { + get: (obj, prop) => { + if (typeof prop !== "string") + return obj[prop]; + if (prop === "addListener") { + return (listener, context2, options) => { + if (options?.order === "last") + lastListeners.set(listener, context2); + else + listeners.set(listener, context2); + }; + } + if (prop === "removeListener") { + return (listener) => { + listeners.delete(listener); + lastListeners.delete(listener); + }; + } + if (!prop.startsWith("on")) + return obj[prop]; + return async (sdkObject, ...params2) => { + for (const [listener, context2] of listeners) { + if (!context2 || sdkObject.attribution.context === context2) + await listener[prop]?.(sdkObject, ...params2); + } + for (const [listener, context2] of lastListeners) { + if (!context2 || sdkObject.attribution.context === context2) + await listener[prop]?.(sdkObject, ...params2); + } + }; + } + }); +} +var import_events3, SdkObject; +var init_instrumentation = __esm({ + "packages/playwright-core/src/server/instrumentation.ts"() { + "use strict"; + import_events3 = require("events"); + init_crypto(); + init_debugLogger(); + SdkObject = class extends import_events3.EventEmitter { + constructor(parent, guidPrefix, guid) { + super(); + this.guid = guid || `${guidPrefix || ""}@${createGuid()}`; + this.setMaxListeners(0); + this.attribution = { ...parent.attribution }; + this.instrumentation = parent.instrumentation; + } + apiLog(message) { + if (!this.attribution.playwright.options.isInternalPlaywright) + debugLogger.log("api", message); + } + closeReason() { + return this.attribution.worker?._closeReason || this.attribution.page?._closeReason || this.attribution.context?._closeReason || this.attribution.browser?._closeReason; + } + }; + } +}); + +// packages/playwright-core/src/server/debugger.ts +function matchesLocation(metadata, location2) { + return !!metadata.location?.file.includes(location2.file) && (location2.line === void 0 || metadata.location.line === location2.line) && (location2.column === void 0 || metadata.location.column === location2.column); +} +var symbol, Debugger; +var init_debugger = __esm({ + "packages/playwright-core/src/server/debugger.ts"() { + "use strict"; + init_protocolMetainfo(); + init_time(); + init_instrumentation(); + init_browserContext(); + symbol = /* @__PURE__ */ Symbol("Debugger"); + Debugger = class _Debugger extends SdkObject { + constructor(context2) { + super(context2, "debugger"); + this._pauseAt = {}; + this._enabled = false; + this._pauseBeforeWaitingActions = false; + this._muted = false; + this._context = context2; + this._context[symbol] = this; + context2.instrumentation.addListener(this, context2, { order: "last" }); + this._context.once(BrowserContext.Events.Close, () => { + this._context.instrumentation.removeListener(this); + }); + } + static { + this.Events = { + PausedStateChanged: "pausedstatechanged" + }; + } + requestPause(progress2) { + if (this.isPaused()) + throw new Error("Debugger is already paused"); + this.setPauseBeforeWaitingActions(); + this.setPauseAt({ next: true }); + } + doResume(progress2) { + if (!this.isPaused()) + throw new Error("Debugger is not paused"); + this.resume(); + } + next(progress2) { + if (!this.isPaused()) + throw new Error("Debugger is not paused"); + this.setPauseBeforeWaitingActions(); + this.setPauseAt({ next: true }); + this.resume(); + } + runTo(progress2, location2) { + if (!this.isPaused()) + throw new Error("Debugger is not paused"); + this.setPauseBeforeWaitingActions(); + this.setPauseAt({ location: location2 }); + this.resume(); + } + async setMuted(muted) { + this._muted = muted; + } + async onBeforeCall(sdkObject, metadata) { + if (this._muted || metadata.internal) + return; + const metainfo = getMetainfo(metadata); + const pauseOnPauseCall = this._enabled && metadata.type === "BrowserContext" && metadata.method === "pause"; + const pauseBeforeAction = !!this._pauseAt.next && !!metainfo?.pause && (this._pauseBeforeWaitingActions || !metainfo?.isAutoWaiting); + const pauseOnLocation = !!this._pauseAt.location && matchesLocation(metadata, this._pauseAt.location); + if (pauseOnPauseCall || pauseBeforeAction || pauseOnLocation) + await this._pause(sdkObject, metadata); + } + async onBeforeInputAction(sdkObject, metadata) { + if (this._muted || metadata.internal) + return; + const metainfo = getMetainfo(metadata); + const pauseBeforeInput = !!this._pauseAt.next && !!metainfo?.pause && !!metainfo?.isAutoWaiting && !this._pauseBeforeWaitingActions; + if (pauseBeforeInput) + await this._pause(sdkObject, metadata); + } + async _pause(sdkObject, metadata) { + if (this._muted || metadata.internal) + return; + if (this._pausedCall) + return; + this._pauseAt = {}; + metadata.pauseStartTime = monotonicTime(); + const result2 = new Promise((resolve) => { + this._pausedCall = { metadata, sdkObject, resolve }; + }); + this.emit(_Debugger.Events.PausedStateChanged); + return result2; + } + resume() { + if (!this._pausedCall) + return; + this._pausedCall.metadata.pauseEndTime = monotonicTime(); + this._pausedCall.resolve(); + this._pausedCall = void 0; + this.emit(_Debugger.Events.PausedStateChanged); + } + setPauseBeforeWaitingActions() { + this._pauseBeforeWaitingActions = true; + } + setPauseAt(at = {}) { + this._enabled = true; + this._pauseAt = at; + } + isPaused(metadata) { + if (metadata) + return this._pausedCall?.metadata === metadata; + return !!this._pausedCall; + } + pausedDetails() { + return this._pausedCall; + } + }; + } +}); + +// packages/playwright-core/src/server/dialog.ts +var Dialog, DialogManager; +var init_dialog = __esm({ + "packages/playwright-core/src/server/dialog.ts"() { + "use strict"; + init_assert(); + init_instrumentation(); + Dialog = class extends SdkObject { + constructor(page, type3, message, onHandle, defaultValue) { + super(page, "dialog"); + this._handled = false; + this._page = page; + this._type = type3; + this._message = message; + this._onHandle = onHandle; + this._defaultValue = defaultValue || ""; + } + async accept(progress2, promptText) { + await progress2.race(this._accept(promptText)); + } + async dismiss(progress2) { + await progress2.race(this._dismiss()); + } + page() { + return this._page; + } + type() { + return this._type; + } + message() { + return this._message; + } + defaultValue() { + return this._defaultValue; + } + async _accept(promptText) { + assert(!this._handled, "Cannot accept dialog which is already handled!"); + this._handled = true; + this._page.browserContext.dialogManager._dialogWillClose(this); + await this._onHandle(true, promptText); + } + async _dismiss() { + assert(!this._handled, "Cannot dismiss dialog which is already handled!"); + this._handled = true; + this._page.browserContext.dialogManager._dialogWillClose(this); + await this._onHandle(false); + } + async _close() { + if (this._type === "beforeunload") + await this._accept(); + else + await this._dismiss(); + } + }; + DialogManager = class { + constructor(instrumentation) { + this._dialogHandlers = /* @__PURE__ */ new Set(); + this._openedDialogs = /* @__PURE__ */ new Set(); + this._instrumentation = instrumentation; + } + dialogDidOpen(dialog) { + for (const frame of dialog.page().frameManager.frames()) + frame.invalidateNonStallingEvaluations(new Error("JavaScript dialog interrupted evaluation")); + this._openedDialogs.add(dialog); + this._instrumentation.onDialog(dialog); + let hasHandlers = false; + for (const handler of this._dialogHandlers) { + if (handler(dialog)) + hasHandlers = true; + } + if (!hasHandlers) + dialog._close().then(() => { + }); + } + _dialogWillClose(dialog) { + this._openedDialogs.delete(dialog); + } + addDialogHandler(handler) { + this._dialogHandlers.add(handler); + } + removeDialogHandler(handler) { + this._dialogHandlers.delete(handler); + if (!this._dialogHandlers.size) { + for (const dialog of this._openedDialogs) + dialog._close().catch(() => { + }); + } + } + hasOpenDialogsForPage(page) { + return [...this._openedDialogs].some((dialog) => dialog.page() === page); + } + async closeBeforeUnloadDialogs() { + await Promise.all([...this._openedDialogs].map(async (dialog) => { + if (dialog.type() === "beforeunload") + await dialog._dismiss(); + })); + } + }; + } +}); + +// packages/playwright-core/src/server/protocolError.ts +function isProtocolError(e) { + return e instanceof ProtocolError; +} +function isSessionClosedError(e) { + return e instanceof ProtocolError && (e.type === "closed" || e.type === "crashed"); +} +var ProtocolError; +var init_protocolError = __esm({ + "packages/playwright-core/src/server/protocolError.ts"() { + "use strict"; + init_stackTrace(); + ProtocolError = class extends Error { + constructor(type3, method, logs) { + super(); + this.type = type3; + this.method = method; + this.logs = logs; + } + setMessage(message) { + rewriteErrorMessage(this, `Protocol error (${this.method}): ${message}`); + } + browserLogMessage() { + return this.logs ? "\nBrowser logs:\n" + this.logs : ""; + } + }; + } +}); + +// packages/playwright-core/src/server/network.ts +function filterCookies(cookies, urls) { + const parsedURLs = urls.map((s) => new URL(s)); + return cookies.filter((c) => { + if (!parsedURLs.length) + return true; + for (const parsedURL of parsedURLs) { + let domain = c.domain; + if (!domain.startsWith(".")) + domain = "." + domain; + if (!("." + parsedURL.hostname).endsWith(domain)) + continue; + if (!parsedURL.pathname.startsWith(c.path)) + continue; + if (parsedURL.protocol !== "https:" && !isLocalHostname(parsedURL.hostname) && c.secure) + continue; + return true; + } + return false; + }); +} +function isLocalHostname(hostname) { + return hostname === "localhost" || hostname.endsWith(".localhost"); +} +function isForbiddenHeader(name, value2) { + const lowerName = name.toLowerCase(); + if (FORBIDDEN_HEADER_NAMES.has(lowerName)) + return true; + if (lowerName.startsWith("proxy-")) + return true; + if (lowerName.startsWith("sec-")) + return true; + if (lowerName === "x-http-method" || lowerName === "x-http-method-override" || lowerName === "x-method-override") { + if (value2 && FORBIDDEN_METHODS.has(value2.toUpperCase())) + return true; + } + return false; +} +function applyHeadersOverrides(original, overrides) { + const forbiddenHeaders = original.filter((header) => isForbiddenHeader(header.name, header.value)); + const allowedHeaders = overrides.filter((header) => !isForbiddenHeader(header.name, header.value)); + return mergeHeaders([allowedHeaders, forbiddenHeaders]); +} +function rewriteCookies(cookies) { + return cookies.map((c) => { + assert(c.url || c.domain && c.path, "Cookie should have a url or a domain/path pair"); + assert(!(c.url && c.domain), "Cookie should have either url or domain"); + assert(!(c.url && c.path), "Cookie should have either url or path"); + assert(!(c.expires && c.expires < 0 && c.expires !== -1), "Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed"); + assert(!(c.expires && c.expires > 0 && c.expires > kMaxCookieExpiresDateInSeconds), "Cookie should have a valid expires, only -1 or a positive number for the unix timestamp in seconds is allowed"); + const copy = { ...c }; + if (copy.url) { + assert(copy.url !== "about:blank", `Blank page can not have cookie "${c.name}"`); + assert(!copy.url.startsWith("data:"), `Data URL page can not have cookie "${c.name}"`); + const url3 = new URL(copy.url); + copy.domain = url3.hostname; + copy.path = url3.pathname.substring(0, url3.pathname.lastIndexOf("/") + 1); + copy.secure = url3.protocol === "https:"; + } + return copy; + }); +} +function parseURL2(url3) { + try { + return new URL(url3); + } catch (e) { + return null; + } +} +function stripFragmentFromUrl(url3) { + if (!url3.includes("#")) + return url3; + return url3.substring(0, url3.indexOf("#")); +} +function statusText(status) { + return STATUS_TEXTS[String(status)] || "Unknown"; +} +function singleHeader(name, value2) { + return [{ name, value: value2 }]; +} +function mergeHeaders(headers) { + const lowerCaseToValue = /* @__PURE__ */ new Map(); + const lowerCaseToOriginalCase = /* @__PURE__ */ new Map(); + for (const h of headers) { + if (!h) + continue; + for (const { name, value: value2 } of h) { + const lower = name.toLowerCase(); + lowerCaseToOriginalCase.set(lower, name); + lowerCaseToValue.set(lower, value2); + } + } + const result2 = []; + for (const [lower, value2] of lowerCaseToValue) + result2.push({ name: lowerCaseToOriginalCase.get(lower), value: value2 }); + return result2; +} +function headersSize(headers) { + let result2 = 0; + for (const header of headers) + result2 += header.name.length + header.value.length + 4; + return result2; +} +function requestHeadersSize(headers, url3, method) { + let result2 = 4; + result2 += method.length; + result2 += new URL(url3).pathname.length; + result2 += 8; + result2 += headersSize(headers); + return result2; +} +function responseHeadersSize(headers, statusText2) { + let result2 = 4; + result2 += 8; + result2 += 3; + result2 += statusText2.length; + result2 += headersSize(headers); + result2 += 2; + return result2; +} +var FORBIDDEN_HEADER_NAMES, FORBIDDEN_METHODS, kMaxCookieExpiresDateInSeconds, Request, Route, Response2, WebSocket, STATUS_TEXTS; +var init_network2 = __esm({ + "packages/playwright-core/src/server/network.ts"() { + "use strict"; + init_manualPromise(); + init_assert(); + init_stackTrace(); + init_protocolError(); + init_browserContext(); + init_fetch(); + init_instrumentation(); + FORBIDDEN_HEADER_NAMES = /* @__PURE__ */ new Set([ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "date", + "dnt", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "set-cookie", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via" + ]); + FORBIDDEN_METHODS = /* @__PURE__ */ new Set(["CONNECT", "TRACE", "TRACK"]); + kMaxCookieExpiresDateInSeconds = 253402300799; + Request = class _Request extends SdkObject { + constructor(context2, frame, serviceWorker, redirectedFrom, documentId, url3, resourceType, method, postData, headers, wallTimeMs) { + super(frame || context2, "request"); + this._response = null; + this._redirectedTo = null; + this._failureText = null; + this._frame = null; + this._serviceWorker = null; + this._rawRequestHeadersPromise = new ManualPromise(); + this._waitForResponsePromise = new ManualPromise(); + this._responseEndTiming = -1; + assert(!url3.startsWith("data:"), "Data urls should not fire requests"); + this._context = context2; + this._frame = frame; + this._serviceWorker = serviceWorker; + this._redirectedFrom = redirectedFrom; + if (redirectedFrom) + redirectedFrom._redirectedTo = this; + this._documentId = documentId; + this._url = stripFragmentFromUrl(url3); + this._resourceType = resourceType; + this._method = method; + this._postData = postData; + this._headers = headers; + this._wallTimeMs = wallTimeMs; + this._isFavicon = url3.endsWith("/favicon.ico") || !!redirectedFrom?._isFavicon; + } + static { + this.Events = { + Response: "response" + }; + } + wallTimeMs() { + return this._wallTimeMs; + } + async raceWithPageClosure(progress2, promise) { + const scope = this._serviceWorker?.openScope ?? this._frame?._page.openScope; + if (scope) + return await progress2.race(scope.race(promise)); + return await progress2.race(promise); + } + async rawRequestHeaders(progress2) { + return await this.raceWithPageClosure(progress2, this.internalRawRequestHeaders()); + } + async response(progress2) { + return await this.raceWithPageClosure(progress2, this._waitForResponse()); + } + _setFailureText(failureText) { + this._failureText = failureText; + this._waitForResponsePromise.resolve(null); + } + _applyOverrides(overrides) { + this._overrides = { ...this._overrides, ...overrides }; + return this._overrides; + } + overrides() { + return this._overrides; + } + url() { + return this._overrides?.url || this._url; + } + resourceType() { + return this._resourceType; + } + method() { + return this._overrides?.method || this._method; + } + postDataBuffer() { + return this._overrides?.postData || this._postData; + } + headers() { + return this._overrides?.headers || this._headers; + } + headerValue(name) { + const lowerCaseName = name.toLowerCase(); + return this.headers().find((h) => h.name.toLowerCase() === lowerCaseName)?.value; + } + // "null" means no raw headers available - we'll use provisional headers as raw headers. + setRawRequestHeaders(headers) { + if (!this._rawRequestHeadersPromise.isDone()) + this._rawRequestHeadersPromise.resolve(headers || this._headers); + } + async internalRawRequestHeaders() { + return this._overrides?.headers || this._rawRequestHeadersPromise; + } + _waitForResponse() { + return this._waitForResponsePromise; + } + _existingResponse() { + return this._response; + } + _setResponse(response2) { + this._response = response2; + this._waitForResponsePromise.resolve(response2); + this.emit(_Request.Events.Response, response2); + } + _finalRequest() { + return this._redirectedTo ? this._redirectedTo._finalRequest() : this; + } + frame() { + return this._frame; + } + serviceWorker() { + return this._serviceWorker; + } + isNavigationRequest() { + return !!this._documentId; + } + redirectedFrom() { + return this._redirectedFrom; + } + failure() { + if (this._failureText === null) + return null; + return { + errorText: this._failureText + }; + } + // TODO(bidi): remove once post body is available. + _setBodySize(size) { + this._bodySize = size; + } + bodySize() { + return this._bodySize || this.postDataBuffer()?.length || 0; + } + async _requestHeadersSize() { + return requestHeadersSize(await this.internalRawRequestHeaders(), this.url(), this.method()); + } + }; + Route = class extends SdkObject { + constructor(request2, delegate) { + super(request2._frame || request2._context, "route"); + this._handled = false; + this._futureHandlers = []; + this._request = request2; + this._delegate = delegate; + this._request._context.addRouteInFlight(this); + } + handle(handlers) { + this._futureHandlers = [...handlers]; + this.continue({ isFallback: true }).catch(() => { + }); + } + async removeHandler(handler) { + this._futureHandlers = this._futureHandlers.filter((h) => h !== handler); + if (handler === this._currentHandler) { + await this.continue({ isFallback: true }).catch(() => { + }); + return; + } + } + request() { + return this._request; + } + async abort(errorCode = "failed") { + this._startHandling(); + this._request._context.emit(BrowserContext.Events.RequestAborted, this._request); + await this._delegate.abort(errorCode); + this._endHandling(); + } + redirectNavigationRequest(url3) { + this._startHandling(); + assert(this._request.isNavigationRequest()); + this._request.frame().redirectNavigation(url3, this._request._documentId, this._request.headerValue("referer")); + this._endHandling(); + } + async fulfill(overrides) { + this._startHandling(); + let body = overrides.body; + let isBase64 = overrides.isBase64 || false; + if (body === void 0) { + if (overrides.fetchResponseUid) { + const buffer = this._request._context.fetchRequest.fetchResponses.get(overrides.fetchResponseUid) || APIRequestContext.findResponseBody(overrides.fetchResponseUid); + assert(buffer, "Fetch response has been disposed"); + body = buffer.toString("base64"); + isBase64 = true; + } else { + body = ""; + isBase64 = false; + } + } else if (!overrides.status || overrides.status < 200 || overrides.status >= 400) { + this._request._responseBodyOverride = { body, isBase64 }; + } + const headers = [...overrides.headers || []]; + this._maybeAddCorsHeaders(headers); + this._request._context.emit(BrowserContext.Events.RequestFulfilled, this._request); + await this._delegate.fulfill({ + status: overrides.status || 200, + headers, + body, + isBase64 + }); + this._endHandling(); + } + // See https://github.com/microsoft/playwright/issues/12929 + _maybeAddCorsHeaders(headers) { + const origin = this._request.headerValue("origin"); + if (!origin) + return; + const requestUrl = new URL(this._request.url()); + if (!requestUrl.protocol.startsWith("http")) + return; + if (requestUrl.origin === origin.trim()) + return; + const corsHeader = headers.find(({ name }) => name === "access-control-allow-origin"); + if (corsHeader) + return; + headers.push({ name: "access-control-allow-origin", value: origin }); + headers.push({ name: "access-control-allow-credentials", value: "true" }); + headers.push({ name: "vary", value: "Origin" }); + } + async continue(overrides) { + if (overrides.url) { + const newUrl = new URL(overrides.url); + const oldUrl = new URL(this._request.url()); + if (oldUrl.protocol !== newUrl.protocol) + throw new Error("New URL must have same protocol as overridden URL"); + } + if (overrides.headers) { + overrides.headers = applyHeadersOverrides(this._request._headers, overrides.headers); + } + overrides = this._request._applyOverrides(overrides); + const nextHandler = this._futureHandlers.shift(); + if (nextHandler) { + this._currentHandler = nextHandler; + nextHandler(this, this._request); + return; + } + if (!overrides.isFallback) + this._request._context.emit(BrowserContext.Events.RequestContinued, this._request); + this._startHandling(); + await this._delegate.continue(overrides); + this._endHandling(); + } + _startHandling() { + assert(!this._handled, "Route is already handled!"); + this._handled = true; + this._currentHandler = void 0; + } + _endHandling() { + this._futureHandlers = []; + this._currentHandler = void 0; + this._request._context.removeRouteInFlight(this); + } + }; + Response2 = class extends SdkObject { + constructor(request2, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker) { + super(request2.frame() || request2._context, "response"); + this._contentPromise = null; + this._finishedPromise = new ManualPromise(); + this._headersMap = /* @__PURE__ */ new Map(); + this._serverAddrPromise = new ManualPromise(); + this._securityDetailsPromise = new ManualPromise(); + this._rawResponseHeadersPromise = new ManualPromise(); + this._httpVersionPromise = new ManualPromise(); + this._encodedBodySizePromise = new ManualPromise(); + this._transferSizePromise = new ManualPromise(); + this._responseHeadersSizePromise = new ManualPromise(); + this._request = request2; + this._timing = timing; + this._status = status; + this._statusText = statusText2; + this._url = request2.url(); + this._headers = headers; + for (const { name, value: value2 } of this._headers) + this._headersMap.set(name.toLowerCase(), value2); + this._getResponseBodyCallback = getResponseBodyCallback; + this._request._setResponse(this); + this._fromServiceWorker = fromServiceWorker; + } + async body(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalBody()); + } + async securityDetails(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalSecurityDetails()); + } + async serverAddr(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalServerAddr()); + } + async rawResponseHeaders(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalRawResponseHeaders()); + } + async httpVersion(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalHttpVersion()); + } + async sizes(progress2) { + return await this._request.raceWithPageClosure(progress2, this.internalSizes()); + } + _serverAddrFinished(addr) { + this._serverAddrPromise.resolve(addr); + } + _securityDetailsFinished(securityDetails) { + this._securityDetailsPromise.resolve(securityDetails); + } + _requestFinished(responseEndTiming) { + this._request._responseEndTiming = Math.max(responseEndTiming, this._timing.responseStart); + if (this._timing.requestStart === -1) + this._timing.requestStart = this._request._responseEndTiming; + this._finishedPromise.resolve(); + } + _setHttpVersion(httpVersion) { + this._httpVersionPromise.resolve(httpVersion); + } + url() { + return this._url; + } + status() { + return this._status; + } + statusText() { + return this._statusText; + } + headers() { + return this._headers; + } + headerValue(name) { + return this._headersMap.get(name); + } + // "null" means no raw headers available - we'll use provisional headers as raw headers. + setRawResponseHeaders(headers) { + if (!this._rawResponseHeadersPromise.isDone()) + this._rawResponseHeadersPromise.resolve(headers || this._headers); + } + setTransferSize(size) { + this._transferSizePromise.resolve(size); + } + setEncodedBodySize(size) { + this._encodedBodySizePromise.resolve(size); + } + setResponseHeadersSize(size) { + this._responseHeadersSizePromise.resolve(size); + } + timing() { + return this._timing; + } + async internalSecurityDetails() { + return await this._securityDetailsPromise || null; + } + async internalServerAddr() { + return await this._serverAddrPromise || null; + } + async internalRawResponseHeaders() { + return await this._rawResponseHeadersPromise; + } + internalBody() { + if (!this._contentPromise) { + this._contentPromise = this._finishedPromise.then(async () => { + if (this._status >= 300 && this._status <= 399) + throw new Error("Response body is unavailable for redirect responses"); + if (this._request._responseBodyOverride) { + const { body, isBase64 } = this._request._responseBodyOverride; + return Buffer.from(body, isBase64 ? "base64" : "utf-8"); + } + try { + return await this._getResponseBodyCallback(); + } catch (e) { + if (isProtocolError(e) && e.type === "error") + rewriteErrorMessage(e, e.message + "\nResponse body is not available for a response that was navigated away from. Read response.body() before triggering any navigation."); + throw e; + } + }); + } + return this._contentPromise; + } + request() { + return this._request; + } + finished() { + return this._finishedPromise; + } + frame() { + return this._request.frame(); + } + async internalHttpVersion() { + const httpVersion = await this._httpVersionPromise || null; + if (!httpVersion) + return "HTTP/1.1"; + if (httpVersion === "http/1.1") + return "HTTP/1.1"; + if (httpVersion === "h2") + return "HTTP/2.0"; + return httpVersion; + } + fromServiceWorker() { + return this._fromServiceWorker; + } + async responseHeadersSize() { + const availableSize = await this._responseHeadersSizePromise; + if (availableSize !== null) + return availableSize; + return responseHeadersSize(await this._rawResponseHeadersPromise, this.statusText()); + } + async internalSizes() { + const requestHeadersSize2 = await this._request._requestHeadersSize(); + const responseHeadersSize2 = await this.responseHeadersSize(); + let encodedBodySize = await this._encodedBodySizePromise; + if (encodedBodySize === null) { + const headers = await this._rawResponseHeadersPromise; + const contentLength = headers.find((h) => h.name.toLowerCase() === "content-length")?.value; + encodedBodySize = contentLength ? +contentLength : 0; + } + let transferSize = await this._transferSizePromise; + if (transferSize === null) { + transferSize = responseHeadersSize2 + encodedBodySize; + } + return { + requestBodySize: this._request.bodySize(), + requestHeadersSize: requestHeadersSize2, + responseBodySize: encodedBodySize, + responseHeadersSize: responseHeadersSize2, + transferSize + }; + } + }; + WebSocket = class _WebSocket extends SdkObject { + constructor(parent, url3) { + super(parent, "ws"); + this._notified = false; + this._url = stripFragmentFromUrl(url3); + } + static { + this.Events = { + Close: "close", + SocketError: "socketerror", + FrameReceived: "framereceived", + FrameSent: "framesent", + Request: "request", + Response: "response" + }; + } + markAsNotified() { + if (this._notified) + return false; + this._notified = true; + return true; + } + url() { + return this._url; + } + wallTimeMs() { + return this._wallTimeMs; + } + setWallTimeMs(wallTimeMs) { + this._wallTimeMs = wallTimeMs; + } + requestSent(headers) { + this.emit(_WebSocket.Events.Request, { headers }); + } + responseReceived(status, statusText2, headers) { + this.emit(_WebSocket.Events.Response, { status, statusText: statusText2, headers }); + } + frameSent(opcode, data, wallTimeMs) { + this.emit(_WebSocket.Events.FrameSent, { opcode, data, wallTimeMs }); + } + frameReceived(opcode, data, wallTimeMs) { + this.emit(_WebSocket.Events.FrameReceived, { opcode, data, wallTimeMs }); + } + error(errorMessage) { + this.emit(_WebSocket.Events.SocketError, errorMessage); + } + closed() { + this.emit(_WebSocket.Events.Close); + } + }; + STATUS_TEXTS = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "306": "Switch Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Too Early", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "510": "Not Extended", + "511": "Network Authentication Required" + }; + } +}); + +// packages/playwright-core/src/server/cookieStore.ts +function parseRawCookie(header) { + const pairs = header.split(";").filter((s) => s.trim().length > 0).map((p) => { + let key = ""; + let value3 = ""; + const separatorPos = p.indexOf("="); + if (separatorPos === -1) { + key = p.trim(); + } else { + key = p.slice(0, separatorPos).trim(); + value3 = p.slice(separatorPos + 1).trim(); + } + return [key, value3]; + }); + if (!pairs.length) + return null; + const [name, value2] = pairs[0]; + const cookie = { + name, + value: value2 + }; + for (let i = 1; i < pairs.length; i++) { + const [name2, value3] = pairs[i]; + switch (name2.toLowerCase()) { + case "expires": + const expiresMs = +new Date(value3); + if (isFinite(expiresMs)) { + if (expiresMs <= 0) + cookie.expires = 0; + else + cookie.expires = Math.min(expiresMs / 1e3, kMaxCookieExpiresDateInSeconds); + } + break; + case "max-age": + const maxAgeSec = parseInt(value3, 10); + if (isFinite(maxAgeSec)) { + if (maxAgeSec <= 0) + cookie.expires = 0; + else + cookie.expires = Math.min(Date.now() / 1e3 + maxAgeSec, kMaxCookieExpiresDateInSeconds); + } + break; + case "domain": + cookie.domain = value3.toLocaleLowerCase() || ""; + if (cookie.domain && !cookie.domain.startsWith(".") && cookie.domain.includes(".")) + cookie.domain = "." + cookie.domain; + break; + case "path": + cookie.path = value3 || ""; + break; + case "secure": + cookie.secure = true; + break; + case "httponly": + cookie.httpOnly = true; + break; + case "samesite": + switch (value3.toLowerCase()) { + case "none": + cookie.sameSite = "None"; + break; + case "lax": + cookie.sameSite = "Lax"; + break; + case "strict": + cookie.sameSite = "Strict"; + break; + } + break; + } + } + return cookie; +} +function domainMatches(value2, domain) { + if (value2 === domain) + return true; + if (!domain.startsWith(".")) + return false; + value2 = "." + value2; + return value2.endsWith(domain); +} +function pathMatches(value2, path66) { + if (value2 === path66) + return true; + if (!value2.endsWith("/")) + value2 = value2 + "/"; + if (!path66.endsWith("/")) + path66 = path66 + "/"; + return value2.startsWith(path66); +} +var Cookie, CookieStore; +var init_cookieStore = __esm({ + "packages/playwright-core/src/server/cookieStore.ts"() { + "use strict"; + init_network2(); + Cookie = class { + constructor(data) { + this._raw = data; + } + _name() { + return this._raw.name; + } + // https://datatracker.ietf.org/doc/html/rfc6265#section-5.4 + matches(url3) { + if (this._raw.secure && (url3.protocol !== "https:" && !isLocalHostname(url3.hostname))) + return false; + if (!domainMatches(url3.hostname, this._raw.domain)) + return false; + if (!pathMatches(url3.pathname, this._raw.path)) + return false; + return true; + } + _equals(other) { + return this._raw.name === other._raw.name && this._raw.domain === other._raw.domain && this._raw.path === other._raw.path; + } + _networkCookie() { + return this._raw; + } + _updateExpiresFrom(other) { + this._raw.expires = other._raw.expires; + } + _expired() { + if (this._raw.expires === -1) + return false; + return this._raw.expires * 1e3 < Date.now(); + } + }; + CookieStore = class _CookieStore { + constructor() { + this._nameToCookies = /* @__PURE__ */ new Map(); + } + addCookies(cookies) { + for (const cookie of cookies) + this._addCookie(new Cookie(cookie)); + } + cookies(url3) { + const result2 = []; + for (const cookie of this._cookiesIterator()) { + if (cookie.matches(url3)) + result2.push(cookie._networkCookie()); + } + return result2; + } + allCookies() { + const result2 = []; + for (const cookie of this._cookiesIterator()) + result2.push(cookie._networkCookie()); + return result2; + } + _addCookie(cookie) { + let set = this._nameToCookies.get(cookie._name()); + if (!set) { + set = /* @__PURE__ */ new Set(); + this._nameToCookies.set(cookie._name(), set); + } + for (const other of set) { + if (other._equals(cookie)) + set.delete(other); + } + set.add(cookie); + _CookieStore.pruneExpired(set); + } + *_cookiesIterator() { + for (const [name, cookies] of this._nameToCookies) { + _CookieStore.pruneExpired(cookies); + for (const cookie of cookies) + yield cookie; + if (cookies.size === 0) + this._nameToCookies.delete(name); + } + } + static pruneExpired(cookies) { + for (const cookie of cookies) { + if (cookie._expired()) + cookies.delete(cookie); + } + } + }; + } +}); + +// packages/playwright-core/src/server/formData.ts +function generateUniqueBoundaryString() { + const charCodes = []; + for (let i = 0; i < 16; i++) + charCodes.push(alphaNumericEncodingMap[Math.floor(Math.random() * alphaNumericEncodingMap.length)]); + return "----WebKitFormBoundary" + String.fromCharCode(...charCodes); +} +var mime2, MultipartFormData, alphaNumericEncodingMap; +var init_formData = __esm({ + "packages/playwright-core/src/server/formData.ts"() { + "use strict"; + mime2 = require("./utilsBundle").mime; + MultipartFormData = class { + constructor() { + this._chunks = []; + this._boundary = generateUniqueBoundaryString(); + } + contentTypeHeader() { + return `multipart/form-data; boundary=${this._boundary}`; + } + addField(name, value2) { + this._beginMultiPartHeader(name); + this._finishMultiPartHeader(); + this._chunks.push(Buffer.from(value2)); + this._finishMultiPartField(); + } + addFileField(name, value2) { + this._beginMultiPartHeader(name); + this._chunks.push(Buffer.from(`; filename="${value2.name}"`)); + this._chunks.push(Buffer.from(`\r +content-type: ${value2.mimeType || mime2.getType(value2.name) || "application/octet-stream"}`)); + this._finishMultiPartHeader(); + this._chunks.push(value2.buffer); + this._finishMultiPartField(); + } + finish() { + this._addBoundary(true); + return Buffer.concat(this._chunks); + } + _beginMultiPartHeader(name) { + this._addBoundary(); + this._chunks.push(Buffer.from(`content-disposition: form-data; name="${name}"`)); + } + _finishMultiPartHeader() { + this._chunks.push(Buffer.from(`\r +\r +`)); + } + _finishMultiPartField() { + this._chunks.push(Buffer.from(`\r +`)); + } + _addBoundary(isLastBoundary) { + this._chunks.push(Buffer.from("--" + this._boundary)); + if (isLastBoundary) + this._chunks.push(Buffer.from("--")); + this._chunks.push(Buffer.from("\r\n")); + } + }; + alphaNumericEncodingMap = [ + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 65, + 66 + ]; + } +}); + +// packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts +function loadDummyServerCertsIfNeeded() { + if (dummyServerTlsOptions) + return; + const { cert, key } = generateSelfSignedCertificate(); + dummyServerTlsOptions = { key, cert }; +} +function normalizeOrigin(origin) { + try { + return new URL(origin).origin; + } catch (error) { + return origin; + } +} +function convertClientCertificatesToTLSOptions(clientCertificates) { + if (!clientCertificates || !clientCertificates.length) + return; + const tlsOptions = { + pfx: [], + key: [], + cert: [] + }; + for (const cert of clientCertificates) { + if (cert.cert) + tlsOptions.cert.push(cert.cert); + if (cert.key) + tlsOptions.key.push({ pem: cert.key, passphrase: cert.passphrase }); + if (cert.pfx) + tlsOptions.pfx.push({ buf: cert.pfx, passphrase: cert.passphrase }); + } + return tlsOptions; +} +function getMatchingTLSOptionsForOrigin(clientCertificates, origin) { + const matchingCerts = clientCertificates?.filter( + (c) => normalizeOrigin(c.origin) === origin + ); + return convertClientCertificatesToTLSOptions(matchingCerts); +} +function rewriteToLocalhostIfNeeded(host) { + return host === "local.playwright" ? "localhost" : host; +} +function rewriteOpenSSLErrorIfNeeded(error) { + if (error.message !== "unsupported" && error.code !== "ERR_CRYPTO_UNSUPPORTED_OPERATION") + return error; + return rewriteErrorMessage(error, [ + "Unsupported TLS certificate.", + "Most likely, the security algorithm of the given certificate was deprecated by OpenSSL.", + "For more details, see https://github.com/openssl/openssl/blob/master/README-PROVIDERS.md#the-legacy-provider", + "You could probably modernize the certificate by following the steps at https://github.com/nodejs/node/issues/40672#issuecomment-1243648223" + ].join("\n")); +} +function parseALPNFromClientHello(buffer) { + if (buffer.length < 6) + return null; + if (buffer[0] !== 22) + return null; + let offset = 5; + if (buffer[offset] !== 1) + return null; + offset += 4; + offset += 2; + offset += 32; + if (offset >= buffer.length) + return null; + const sessionIdLength = buffer[offset]; + offset += 1 + sessionIdLength; + if (offset + 2 > buffer.length) + return null; + const cipherSuitesLength = buffer.readUInt16BE(offset); + offset += 2 + cipherSuitesLength; + if (offset >= buffer.length) + return null; + const compressionMethodsLength = buffer[offset]; + offset += 1 + compressionMethodsLength; + if (offset + 2 > buffer.length) + return null; + const extensionsLength = buffer.readUInt16BE(offset); + offset += 2; + const extensionsEnd = offset + extensionsLength; + if (extensionsEnd > buffer.length) + return null; + while (offset + 4 <= extensionsEnd) { + const extensionType = buffer.readUInt16BE(offset); + offset += 2; + const extensionLength = buffer.readUInt16BE(offset); + offset += 2; + if (offset + extensionLength > extensionsEnd) + return null; + if (extensionType === 16) + return parseALPNExtension(buffer.subarray(offset, offset + extensionLength)); + offset += extensionLength; + } + return null; +} +function parseALPNExtension(buffer) { + if (buffer.length < 2) + return null; + const listLength = buffer.readUInt16BE(0); + if (listLength !== buffer.length - 2) + return null; + const protocols = []; + let offset = 2; + while (offset < buffer.length) { + const protocolLength = buffer[offset]; + offset += 1; + if (offset + protocolLength > buffer.length) + break; + const protocol = buffer.subarray(offset, offset + protocolLength).toString("utf8"); + protocols.push(protocol); + offset += protocolLength; + } + return protocols.length > 0 ? protocols : null; +} +var import_events4, import_http23, import_net3, import_stream2, import_tls2, getProxyForUrl2, dummyServerTlsOptions, SocksProxyConnection, ClientCertificatesProxy; +var init_socksClientCertificatesInterceptor = __esm({ + "packages/playwright-core/src/server/socksClientCertificatesInterceptor.ts"() { + "use strict"; + import_events4 = require("events"); + import_http23 = __toESM(require("http2")); + import_net3 = __toESM(require("net")); + import_stream2 = __toESM(require("stream")); + import_tls2 = __toESM(require("tls")); + init_socksProxy(); + init_debugLogger(); + init_happyEyeballs(); + init_stringUtils(); + init_crypto(); + init_stackTrace(); + init_network(); + init_browserContext(); + ({ getProxyForUrl: getProxyForUrl2 } = require("./utilsBundle")); + dummyServerTlsOptions = void 0; + SocksProxyConnection = class { + constructor(socksProxy, uid, host, port) { + this._firstPackageReceived = false; + this._closed = false; + this.socksProxy = socksProxy; + this.uid = uid; + this.host = host; + this.port = port; + this._serverCloseEventListener = () => { + this._browserEncrypted.destroy(); + }; + this._browserEncrypted = new import_stream2.default.Duplex({ + read: () => { + }, + write: (data, encoding, callback) => { + this.socksProxy._socksProxy.sendSocketData({ uid: this.uid, data }); + callback(); + }, + destroy: (error, callback) => { + if (error) + socksProxy._socksProxy.sendSocketError({ uid: this.uid, error: error.message }); + else + socksProxy._socksProxy.sendSocketEnd({ uid: this.uid }); + callback(); + } + }); + } + async connect() { + const proxyAgent = this.socksProxy._getProxyAgent(this.host, this.port); + if (proxyAgent) + this._serverEncrypted = await proxyAgent.connect(new import_events4.EventEmitter(), { host: rewriteToLocalhostIfNeeded(this.host), port: this.port, secureEndpoint: false }); + else + this._serverEncrypted = await createSocket(rewriteToLocalhostIfNeeded(this.host), this.port); + this._serverEncrypted.once("close", this._serverCloseEventListener); + this._serverEncrypted.once("error", (error) => this._browserEncrypted.destroy(error)); + if (this._closed) { + this._serverEncrypted.destroy(); + return; + } + this.socksProxy._socksProxy.socketConnected({ + uid: this.uid, + host: this._serverEncrypted.localAddress, + port: this._serverEncrypted.localPort + }); + } + onClose() { + this._serverEncrypted.destroy(); + this._browserEncrypted.destroy(); + this._closed = true; + } + onData(data) { + if (!this._firstPackageReceived) { + this._firstPackageReceived = true; + const secureContext = data[0] === 22 ? this.socksProxy.secureContextMap.get(normalizeOrigin(`https://${this.host}:${this.port}`)) : void 0; + if (secureContext) + this._establishTlsTunnel(this._browserEncrypted, data, secureContext); + else + this._establishPlaintextTunnel(this._browserEncrypted); + } + this._browserEncrypted.push(data); + } + _establishPlaintextTunnel(browserEncrypted) { + browserEncrypted.pipe(this._serverEncrypted); + this._serverEncrypted.pipe(browserEncrypted); + } + _establishTlsTunnel(browserEncrypted, clientHello, secureContext) { + const browserALPNProtocols = parseALPNFromClientHello(clientHello) || ["http/1.1"]; + debugLogger.log("client-certificates", `Browser->Proxy ${this.host}:${this.port} offers ALPN ${browserALPNProtocols}`); + const rejectUnauthorized = !this.socksProxy.ignoreHTTPSErrors; + const serverDecrypted = import_tls2.default.connect({ + socket: this._serverEncrypted, + host: this.host, + port: this.port, + rejectUnauthorized, + ALPNProtocols: browserALPNProtocols, + servername: !import_net3.default.isIP(this.host) ? this.host : void 0, + secureContext + }, async () => { + const browserDecrypted = await this._upgradeToTLSIfNeeded(browserEncrypted, serverDecrypted.alpnProtocol); + debugLogger.log("client-certificates", `Proxy->Server ${this.host}:${this.port} chooses ALPN ${browserDecrypted.alpnProtocol}`); + browserDecrypted.pipe(serverDecrypted); + serverDecrypted.pipe(browserDecrypted); + const cleanup = (error) => this._serverEncrypted.destroy(error); + browserDecrypted.once("error", cleanup); + serverDecrypted.once("error", cleanup); + browserDecrypted.once("close", cleanup); + serverDecrypted.once("close", cleanup); + if (this._closed) + serverDecrypted.destroy(); + }); + serverDecrypted.once("error", async (error) => { + debugLogger.log("client-certificates", `error when connecting to server: ${error.message.replaceAll("\n", " ")}`); + this._serverEncrypted.removeListener("close", this._serverCloseEventListener); + this._serverEncrypted.destroy(); + const browserDecrypted = await this._upgradeToTLSIfNeeded(this._browserEncrypted, serverDecrypted.alpnProtocol); + const responseBody = escapeHTML("Playwright client-certificate error: " + error.message).replaceAll("\n", "
"); + if (browserDecrypted.alpnProtocol === "h2") { + if ("performServerHandshake" in import_http23.default) { + const session2 = import_http23.default.performServerHandshake(browserDecrypted); + session2.on("error", (error2) => { + this._browserEncrypted.destroy(error2); + }); + session2.once("stream", (stream4) => { + const cleanup = (error2) => { + session2.close(); + this._browserEncrypted.destroy(error2); + }; + stream4.once("end", cleanup); + stream4.once("error", cleanup); + stream4.respond({ + [import_http23.default.constants.HTTP2_HEADER_CONTENT_TYPE]: "text/html", + [import_http23.default.constants.HTTP2_HEADER_STATUS]: 503 + }); + stream4.end(responseBody); + }); + } else { + this._browserEncrypted.destroy(error); + } + } else { + browserDecrypted.end([ + "HTTP/1.1 503 Internal Server Error", + "Content-Type: text/html; charset=utf-8", + "Content-Length: " + Buffer.byteLength(responseBody), + "", + responseBody + ].join("\r\n")); + } + }); + } + async _upgradeToTLSIfNeeded(socket, alpnProtocol) { + this._brorwserDecrypted ??= new Promise((resolve, reject) => { + const dummyServer = import_tls2.default.createServer({ + ...dummyServerTlsOptions, + ALPNProtocols: [alpnProtocol || "http/1.1"] + }); + dummyServer.emit("connection", socket); + dummyServer.once("secureConnection", (tlsSocket) => { + dummyServer.close(); + resolve(tlsSocket); + }); + dummyServer.once("error", (error) => { + dummyServer.close(); + reject(error); + }); + }); + return this._brorwserDecrypted; + } + }; + ClientCertificatesProxy = class _ClientCertificatesProxy { + constructor(contextOptions) { + this._connections = /* @__PURE__ */ new Map(); + this.secureContextMap = /* @__PURE__ */ new Map(); + verifyClientCertificates(contextOptions.clientCertificates); + this.ignoreHTTPSErrors = contextOptions.ignoreHTTPSErrors; + this._proxy = contextOptions.proxy; + this._initSecureContexts(contextOptions.clientCertificates); + this._socksProxy = new SocksProxy(); + this._socksProxy.setPattern("*"); + this._socksProxy.addListener(SocksProxy.Events.SocksRequested, async (payload) => { + try { + const connection = new SocksProxyConnection(this, payload.uid, payload.host, payload.port); + await connection.connect(); + this._connections.set(payload.uid, connection); + } catch (error) { + debugLogger.log("client-certificates", `Failed to connect to ${payload.host}:${payload.port}: ${error.message}`); + this._socksProxy.socketFailed({ uid: payload.uid, errorCode: error.code }); + } + }); + this._socksProxy.addListener(SocksProxy.Events.SocksData, (payload) => { + this._connections.get(payload.uid)?.onData(payload.data); + }); + this._socksProxy.addListener(SocksProxy.Events.SocksClosed, (payload) => { + this._connections.get(payload.uid)?.onClose(); + this._connections.delete(payload.uid); + }); + loadDummyServerCertsIfNeeded(); + } + _getProxyAgent(host, port) { + const proxyFromOptions = createProxyAgent(this._proxy); + if (proxyFromOptions) + return proxyFromOptions; + const proxyFromEnv = getProxyForUrl2(`https://${host}:${port}`); + if (proxyFromEnv) + return createProxyAgent({ server: proxyFromEnv }); + } + _initSecureContexts(clientCertificates) { + const origin2certs = /* @__PURE__ */ new Map(); + for (const cert of clientCertificates || []) { + const origin = normalizeOrigin(cert.origin); + const certs = origin2certs.get(origin) || []; + certs.push(cert); + origin2certs.set(origin, certs); + } + for (const [origin, certs] of origin2certs) { + try { + this.secureContextMap.set(origin, import_tls2.default.createSecureContext(convertClientCertificatesToTLSOptions(certs))); + } catch (error) { + error = rewriteOpenSSLErrorIfNeeded(error); + throw rewriteErrorMessage(error, `Failed to load client certificate: ${error.message}`); + } + } + } + static async create(progress2, contextOptions) { + const proxy = new _ClientCertificatesProxy(contextOptions); + try { + await progress2.race(proxy._socksProxy.listen(0, "127.0.0.1")); + return proxy; + } catch (error) { + await progress2.race(proxy.close()); + throw error; + } + } + proxySettings() { + return { server: `socks5://127.0.0.1:${this._socksProxy.port()}` }; + } + async close() { + await this._socksProxy.close(); + } + }; + } +}); + +// packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts +function frameSnapshotStreamer(snapshotStreamer, removeNoScript) { + if (window[snapshotStreamer]) + return; + const kShadowAttribute = "__playwright_shadow_root_"; + const kValueAttribute = "__playwright_value_"; + const kCheckedAttribute = "__playwright_checked_"; + const kSelectedAttribute = "__playwright_selected_"; + const kScrollTopAttribute = "__playwright_scroll_top_"; + const kScrollLeftAttribute = "__playwright_scroll_left_"; + const kStyleSheetAttribute = "__playwright_style_sheet_"; + const kTargetAttribute = "__playwright_target__"; + const kCustomElementsAttribute = "__playwright_custom_elements__"; + const kCurrentSrcAttribute = "__playwright_current_src__"; + const kBoundingRectAttribute = "__playwright_bounding_rect__"; + const kPopoverOpenAttribute = "__playwright_popover_open_"; + const kDialogOpenAttribute = "__playwright_dialog_open_"; + const kSnapshotFrameId = /* @__PURE__ */ Symbol("__playwright_snapshot_frameid_"); + const kCachedData = /* @__PURE__ */ Symbol("__playwright_snapshot_cache_"); + const kEndOfList = /* @__PURE__ */ Symbol("__playwright_end_of_list_"); + function resetCachedData(obj) { + delete obj[kCachedData]; + } + function ensureCachedData(obj) { + if (!obj[kCachedData]) + obj[kCachedData] = {}; + return obj[kCachedData]; + } + const kObserverConfig = { attributes: true, subtree: true }; + function removeHash2(url3) { + try { + const u = new URL(url3); + u.hash = ""; + return u.toString(); + } catch (e) { + return url3; + } + } + class Streamer { + constructor() { + this._lastSnapshotNumber = 0; + this._staleStyleSheets = /* @__PURE__ */ new Set(); + this._modifiedStyleSheets = /* @__PURE__ */ new Set(); + this._readingStyleSheet = false; + this._targetGeneration = 0; + const invalidateCSSGroupingRule = (rule) => { + if (rule.parentStyleSheet) + this._invalidateStyleSheet(rule.parentStyleSheet); + }; + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "insertRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "deleteRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "addRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "removeRule", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeGetter(window.CSSStyleSheet.prototype, "rules", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeGetter(window.CSSStyleSheet.prototype, "cssRules", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSStyleSheet.prototype, "replaceSync", (sheet) => this._invalidateStyleSheet(sheet)); + this._interceptNativeMethod(window.CSSGroupingRule.prototype, "insertRule", invalidateCSSGroupingRule); + this._interceptNativeMethod(window.CSSGroupingRule.prototype, "deleteRule", invalidateCSSGroupingRule); + this._interceptNativeGetter(window.CSSGroupingRule.prototype, "cssRules", invalidateCSSGroupingRule); + this._interceptNativeSetter(window.StyleSheet.prototype, "disabled", (sheet) => { + if (sheet instanceof CSSStyleSheet) + this._invalidateStyleSheet(sheet); + }); + this._interceptNativeAsyncMethod(window.CSSStyleSheet.prototype, "replace", (sheet) => this._invalidateStyleSheet(sheet)); + this._fakeBase = document.createElement("base"); + this._observer = new MutationObserver((list) => this._handleMutations(list)); + this._ensureObservingCurrentDocument(); + } + _refreshListenersWhenNeeded() { + this._refreshListeners(); + const customEventName = "__playwright_snapshotter_global_listeners_check__"; + let seenEvent = false; + const handleCustomEvent = () => seenEvent = true; + window.addEventListener(customEventName, handleCustomEvent); + const observer = new MutationObserver((entries) => { + const newDocumentElement = entries.some((entry) => Array.from(entry.addedNodes).includes(document.documentElement)); + if (newDocumentElement) { + seenEvent = false; + window.dispatchEvent(new CustomEvent(customEventName)); + if (!seenEvent) { + window.addEventListener(customEventName, handleCustomEvent); + this._refreshListeners(); + } + } + }); + observer.observe(document, { childList: true }); + } + _refreshListeners() { + document.addEventListener("__playwright_mark_target__", (event) => { + const target = event.composedPath()[0]; + if (target?.nodeType !== Node.ELEMENT_NODE) + return; + target.__playwright_target__ = this._targetGeneration; + }); + document.addEventListener("__playwright_reset_targets__", () => { + ++this._targetGeneration; + }); + } + _interceptNativeMethod(obj, method, cb) { + const native = obj[method]; + if (!native) + return; + obj[method] = function(...args) { + const result2 = native.call(this, ...args); + cb(this, result2); + return result2; + }; + } + _interceptNativeAsyncMethod(obj, method, cb) { + const native = obj[method]; + if (!native) + return; + obj[method] = async function(...args) { + const result2 = await native.call(this, ...args); + cb(this, result2); + return result2; + }; + } + _interceptNativeGetter(obj, prop, cb) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + Object.defineProperty(obj, prop, { + ...descriptor, + get: function() { + const result2 = descriptor.get.call(this); + cb(this, result2); + return result2; + } + }); + } + _interceptNativeSetter(obj, prop, cb) { + const descriptor = Object.getOwnPropertyDescriptor(obj, prop); + Object.defineProperty(obj, prop, { + ...descriptor, + set: function(value2) { + const result2 = descriptor.set.call(this, value2); + cb(this, value2); + return result2; + } + }); + } + _handleMutations(list) { + for (const mutation of list) + ensureCachedData(mutation.target).attributesCached = void 0; + } + _ensureObservingCurrentDocument() { + if (this._observedDocument === document) + return; + this._observedDocument = document; + this._observer.disconnect(); + this._observer.observe(document, kObserverConfig); + this._refreshListenersWhenNeeded(); + } + _invalidateStyleSheet(sheet) { + if (this._readingStyleSheet) + return; + this._staleStyleSheets.add(sheet); + if (sheet.href !== null) + this._modifiedStyleSheets.add(sheet); + } + _updateStyleElementStyleSheetTextIfNeeded(sheet, forceText) { + const data = ensureCachedData(sheet); + if (this._staleStyleSheets.has(sheet) || forceText && data.cssText === void 0) { + this._staleStyleSheets.delete(sheet); + try { + data.cssText = this._getSheetText(sheet); + } catch (e) { + data.cssText = ""; + } + } + return data.cssText; + } + // Returns either content, ref, or no override. + _updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber) { + const data = ensureCachedData(sheet); + if (this._staleStyleSheets.has(sheet)) { + this._staleStyleSheets.delete(sheet); + try { + data.cssText = this._getSheetText(sheet); + data.cssRef = snapshotNumber; + return data.cssText; + } catch (e) { + } + } + return data.cssRef === void 0 ? void 0 : snapshotNumber - data.cssRef; + } + markIframe(iframeElement, frameId) { + iframeElement[kSnapshotFrameId] = frameId; + } + resetHistory() { + this._staleStyleSheets.clear(); + const visitNode = (node) => { + resetCachedData(node); + if (node.nodeType === Node.ELEMENT_NODE) { + const element3 = node; + if (element3.shadowRoot) + visitNode(element3.shadowRoot); + } + for (let child = node.firstChild; child; child = child.nextSibling) + visitNode(child); + }; + visitNode(document.documentElement); + visitNode(this._fakeBase); + } + __sanitizeMetaAttribute(name, value2, httpEquiv) { + if (name === "charset") + return "utf-8"; + if (httpEquiv.toLowerCase() !== "content-type" || name !== "content") + return value2; + const [type3, ...params2] = value2.split(";"); + if (type3 !== "text/html" || params2.length <= 0) + return value2; + const charsetParamIdx = params2.findIndex((param) => param.trim().startsWith("charset=")); + if (charsetParamIdx > -1) + params2[charsetParamIdx] = "charset=utf-8"; + return `${type3}; ${params2.join("; ")}`; + } + _sanitizeUrl(url3) { + if (url3.startsWith("javascript:") || url3.startsWith("vbscript:")) + return ""; + return url3; + } + _sanitizeSrcSet(srcset) { + return srcset.split(",").map((src) => { + src = src.trim(); + const spaceIndex = src.lastIndexOf(" "); + if (spaceIndex === -1) + return this._sanitizeUrl(src); + return this._sanitizeUrl(src.substring(0, spaceIndex).trim()) + src.substring(spaceIndex); + }).join(", "); + } + _resolveUrl(base, url3) { + if (url3 === "") + return ""; + try { + return new URL(url3, base).href; + } catch (e) { + return url3; + } + } + _getSheetBase(sheet) { + let rootSheet = sheet; + while (rootSheet.parentStyleSheet) + rootSheet = rootSheet.parentStyleSheet; + if (rootSheet.ownerNode) + return rootSheet.ownerNode.baseURI; + return document.baseURI; + } + _getSheetText(sheet) { + this._readingStyleSheet = true; + try { + if (sheet.disabled) + return ""; + const rules = []; + for (const rule of sheet.cssRules) + rules.push(rule.cssText); + return rules.join("\n"); + } finally { + this._readingStyleSheet = false; + } + } + captureSnapshot(reset) { + const timestamp = performance.now(); + const snapshotNumber = ++this._lastSnapshotNumber; + if (reset === "history") + this.resetHistory(); + if (reset) + ++this._targetGeneration; + let nodeCounter = 0; + let shadowDomNesting = 0; + let headNesting = 0; + this._ensureObservingCurrentDocument(); + this._handleMutations(this._observer.takeRecords()); + const definedCustomElements = /* @__PURE__ */ new Set(); + const visitNode = (node) => { + const nodeType = node.nodeType; + const nodeName = nodeType === Node.DOCUMENT_FRAGMENT_NODE ? "template" : node.nodeName; + if (nodeType !== Node.ELEMENT_NODE && nodeType !== Node.DOCUMENT_FRAGMENT_NODE && nodeType !== Node.TEXT_NODE) + return; + if (nodeName === "SCRIPT") + return; + if (nodeName === "LINK" && nodeType === Node.ELEMENT_NODE) { + const rel = node.getAttribute("rel")?.toLowerCase(); + if (rel === "preload" || rel === "prefetch") + return; + } + if (removeNoScript && nodeName === "NOSCRIPT") + return; + if (nodeName === "META") { + const httpEquiv = node.httpEquiv.toLowerCase(); + if (httpEquiv === "content-security-policy" || httpEquiv === "refresh" || httpEquiv === "set-cookie") + return; + } + if ((nodeName === "IFRAME" || nodeName === "FRAME") && headNesting) + return; + const data = ensureCachedData(node); + const values = []; + let equals = !!data.cached; + let extraNodes = 0; + const expectValue = (value2) => { + equals = equals && data.cached[values.length] === value2; + values.push(value2); + }; + const checkAndReturn = (n) => { + data.attributesCached = true; + if (equals) + return { equals: true, n: [[snapshotNumber - data.ref[0], data.ref[1]]] }; + nodeCounter += extraNodes; + data.ref = [snapshotNumber, nodeCounter++]; + data.cached = values; + return { equals: false, n }; + }; + if (nodeType === Node.TEXT_NODE) { + const value2 = node.nodeValue || ""; + expectValue(value2); + return checkAndReturn(value2); + } + if (nodeName === "STYLE") { + const sheet = node.sheet; + let cssText; + if (sheet) + cssText = this._updateStyleElementStyleSheetTextIfNeeded(sheet); + cssText = cssText || node.textContent || ""; + expectValue(cssText); + extraNodes++; + return checkAndReturn([nodeName, {}, cssText]); + } + const attrs = {}; + const result3 = [nodeName, attrs]; + const visitChild = (child) => { + const snapshot3 = visitNode(child); + if (snapshot3) { + result3.push(snapshot3.n); + expectValue(child); + equals = equals && snapshot3.equals; + } + }; + const visitChildStyleSheet = (child) => { + const snapshot3 = visitStyleSheet(child); + if (snapshot3) { + result3.push(snapshot3.n); + expectValue(child); + equals = equals && snapshot3.equals; + } + }; + if (nodeType === Node.DOCUMENT_FRAGMENT_NODE) + attrs[kShadowAttribute] = "open"; + if (nodeType === Node.ELEMENT_NODE) { + const element3 = node; + if (element3.localName.includes("-") && window.customElements?.get(element3.localName)) + definedCustomElements.add(element3.localName); + if (nodeName === "INPUT" || nodeName === "TEXTAREA") { + const value2 = element3.value; + expectValue(kValueAttribute); + expectValue(value2); + attrs[kValueAttribute] = value2; + } + if (nodeName === "INPUT" && ["checkbox", "radio"].includes(element3.type)) { + const value2 = element3.checked ? "true" : "false"; + expectValue(kCheckedAttribute); + expectValue(value2); + attrs[kCheckedAttribute] = value2; + } + if (nodeName === "OPTION") { + const value2 = element3.selected ? "true" : "false"; + expectValue(kSelectedAttribute); + expectValue(value2); + attrs[kSelectedAttribute] = value2; + } + if (nodeName === "CANVAS" || nodeName === "IFRAME" || nodeName === "FRAME") { + const boundingRect = element3.getBoundingClientRect(); + const value2 = JSON.stringify({ + left: boundingRect.left, + top: boundingRect.top, + right: boundingRect.right, + bottom: boundingRect.bottom + }); + expectValue(kBoundingRectAttribute); + expectValue(value2); + attrs[kBoundingRectAttribute] = value2; + } + if (element3.popover && element3.matches && element3.matches(":popover-open")) { + const value2 = "true"; + expectValue(kPopoverOpenAttribute); + expectValue(value2); + attrs[kPopoverOpenAttribute] = value2; + } + if (nodeName === "DIALOG" && element3.open) { + const value2 = element3.matches(":modal") ? "modal" : "true"; + expectValue(kDialogOpenAttribute); + expectValue(value2); + attrs[kDialogOpenAttribute] = value2; + } + if (element3.scrollTop) { + expectValue(kScrollTopAttribute); + expectValue(element3.scrollTop); + attrs[kScrollTopAttribute] = "" + element3.scrollTop; + } + if (element3.scrollLeft) { + expectValue(kScrollLeftAttribute); + expectValue(element3.scrollLeft); + attrs[kScrollLeftAttribute] = "" + element3.scrollLeft; + } + if (element3.shadowRoot) { + ++shadowDomNesting; + visitChild(element3.shadowRoot); + --shadowDomNesting; + } + if (element3.__playwright_target__ === this._targetGeneration) { + expectValue(kTargetAttribute); + attrs[kTargetAttribute] = ""; + } + } + if (nodeName === "HEAD") { + ++headNesting; + this._fakeBase.setAttribute("href", document.baseURI); + visitChild(this._fakeBase); + } + for (let child = node.firstChild; child; child = child.nextSibling) + visitChild(child); + if (nodeName === "HEAD") + --headNesting; + expectValue(kEndOfList); + let documentOrShadowRoot = null; + if (node.ownerDocument.documentElement === node) + documentOrShadowRoot = node.ownerDocument; + else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) + documentOrShadowRoot = node; + if (documentOrShadowRoot) { + for (const sheet of documentOrShadowRoot.adoptedStyleSheets || []) + visitChildStyleSheet(sheet); + expectValue(kEndOfList); + } + if (nodeName === "IFRAME" || nodeName === "FRAME") { + const element3 = node; + const frameId = element3[kSnapshotFrameId]; + const name = "src"; + const value2 = frameId ? `/snapshot/${frameId}` : ""; + expectValue(name); + expectValue(value2); + attrs[name] = value2; + } + if (nodeName === "BODY" && definedCustomElements.size) { + const value2 = [...definedCustomElements].join(","); + expectValue(kCustomElementsAttribute); + expectValue(value2); + attrs[kCustomElementsAttribute] = value2; + } + if (nodeName === "IMG" || nodeName === "PICTURE") { + const value2 = nodeName === "PICTURE" ? "" : this._sanitizeUrl(node.currentSrc); + expectValue(kCurrentSrcAttribute); + expectValue(value2); + attrs[kCurrentSrcAttribute] = value2; + } + if (equals && data.attributesCached && !shadowDomNesting) + return checkAndReturn(result3); + if (nodeType === Node.ELEMENT_NODE) { + const element3 = node; + for (let i = 0; i < element3.attributes.length; i++) { + const name = element3.attributes[i].name; + if (nodeName === "LINK" && name === "integrity") + continue; + if (nodeName === "IFRAME" && (name === "src" || name === "srcdoc" || name === "sandbox")) + continue; + if (nodeName === "FRAME" && name === "src") + continue; + if (nodeName === "DIALOG" && name === "open") + continue; + let value2 = element3.attributes[i].value; + if (nodeName === "META") + value2 = this.__sanitizeMetaAttribute(name, value2, node.httpEquiv); + else if (name === "src" && nodeName === "IMG") + value2 = this._sanitizeUrl(value2); + else if (name === "srcset" && nodeName === "IMG") + value2 = this._sanitizeSrcSet(value2); + else if (name === "srcset" && nodeName === "SOURCE") + value2 = this._sanitizeSrcSet(value2); + else if (name === "href" && nodeName === "LINK") + value2 = this._sanitizeUrl(value2); + else if (name.startsWith("on")) + value2 = ""; + expectValue(name); + expectValue(value2); + attrs[name] = value2; + } + expectValue(kEndOfList); + } + if (result3.length === 2 && !Object.keys(attrs).length) + result3.pop(); + return checkAndReturn(result3); + }; + const visitStyleSheet = (sheet) => { + const data = ensureCachedData(sheet); + const oldCSSText = data.cssText; + const cssText = this._updateStyleElementStyleSheetTextIfNeeded( + sheet, + true + /* forceText */ + ); + if (cssText === oldCSSText) + return { equals: true, n: [[snapshotNumber - data.ref[0], data.ref[1]]] }; + data.ref = [snapshotNumber, nodeCounter++]; + return { + equals: false, + n: ["template", { + [kStyleSheetAttribute]: cssText + }] + }; + }; + let html; + if (document.documentElement) { + const { n } = visitNode(document.documentElement); + html = n; + } else { + html = ["html"]; + } + const result2 = { + html, + doctype: document.doctype ? document.doctype.name : void 0, + resourceOverrides: [], + viewport: { + width: window.innerWidth, + height: window.innerHeight + }, + url: location.href, + wallTime: Date.now(), + collectionTime: 0 + }; + for (const sheet of this._modifiedStyleSheets) { + if (sheet.href === null) + continue; + const content = this._updateLinkStyleSheetTextIfNeeded(sheet, snapshotNumber); + if (content === void 0) { + continue; + } + const base = this._getSheetBase(sheet); + const url3 = removeHash2(this._resolveUrl(base, sheet.href)); + result2.resourceOverrides.push({ url: url3, content, contentType: "text/css" }); + } + result2.collectionTime = performance.now() - timestamp; + return result2; + } + } + window[snapshotStreamer] = new Streamer(); +} +var init_snapshotterInjected = __esm({ + "packages/playwright-core/src/server/trace/recorder/snapshotterInjected.ts"() { + "use strict"; + } +}); + +// packages/playwright-core/src/server/trace/recorder/snapshotter.ts +var mime3, Snapshotter, kNeedsResetSymbol; +var init_snapshotter = __esm({ + "packages/playwright-core/src/server/trace/recorder/snapshotter.ts"() { + "use strict"; + init_time(); + init_crypto(); + init_debugLogger(); + init_eventsHelper(); + init_snapshotterInjected(); + init_browserContext(); + init_progress(); + mime3 = require("./utilsBundle").mime; + Snapshotter = class { + constructor(context2, delegate) { + this._eventListeners = []; + this._started = false; + this._context = context2; + this._delegate = delegate; + const guid = createGuid(); + this._snapshotStreamer = "__playwright_snapshot_streamer_" + guid; + } + started() { + return this._started; + } + async start(progress2) { + this._started = true; + if (!this._initScript) + await this._initialize(progress2); + await progress2.race(this.reset()); + } + async reset() { + if (this._started) + await this._context.safeNonStallingEvaluateInAllFrames(`window["${this._snapshotStreamer}"].resetHistory()`, "main"); + } + stop() { + this._started = false; + } + async resetForReuse() { + if (this._initScript) { + eventsHelper.removeEventListeners(this._eventListeners); + await this._initScript.dispose(); + this._initScript = void 0; + } + } + async _initialize(progress2) { + for (const page of this._context.pages()) + this._onPage(page); + this._eventListeners = [ + eventsHelper.addEventListener(this._context, BrowserContext.Events.Page, this._onPage.bind(this)), + eventsHelper.addEventListener(this._context, BrowserContext.Events.FrameAttached, (frame) => this._annotateFrameHierarchy(frame)) + ]; + const { javaScriptEnabled } = this._context._options; + const initScriptSource = `(${frameSnapshotStreamer})("${this._snapshotStreamer}", ${javaScriptEnabled || javaScriptEnabled === void 0})`; + this._initScript = await this._context.addInitScript(progress2, initScriptSource); + await progress2.race(this._context.safeNonStallingEvaluateInAllFrames(initScriptSource, "main")); + } + dispose() { + eventsHelper.removeEventListeners(this._eventListeners); + } + async _captureFrameSnapshot(frame, resetTargets) { + const needsHistoryReset = !!frame[kNeedsResetSymbol]; + frame[kNeedsResetSymbol] = false; + const reset = needsHistoryReset ? "history" : resetTargets ? "targets" : void 0; + const expression2 = `window["${this._snapshotStreamer}"].captureSnapshot(${JSON.stringify(reset)})`; + try { + return await frame.nonStallingRawEvaluateInExistingMainContext(expression2); + } catch (e) { + frame[kNeedsResetSymbol] = true; + debugLogger.log("error", e); + } + } + async captureSnapshot(page, callId, snapshotName, resetTargets) { + const snapshots = page.frames().map(async (frame) => { + const data = await this._captureFrameSnapshot(frame, resetTargets); + if (!data || !this._started) + return; + const snapshot3 = { + callId, + snapshotName, + pageId: page.guid, + frameId: frame.guid, + frameUrl: data.url, + doctype: data.doctype, + html: data.html, + viewport: data.viewport, + timestamp: monotonicTime(), + wallTime: data.wallTime, + collectionTime: data.collectionTime, + resourceOverrides: [], + isMainFrame: page.mainFrame() === frame + }; + for (const { url: url3, content, contentType } of data.resourceOverrides) { + if (typeof content === "string") { + const buffer = Buffer.from(content); + const sha1 = calculateSha1(buffer) + "." + (mime3.getExtension(contentType) || "dat"); + this._delegate.onSnapshotterBlob({ sha1, buffer }); + snapshot3.resourceOverrides.push({ url: url3, sha1 }); + } else { + snapshot3.resourceOverrides.push({ url: url3, ref: content }); + } + } + this._delegate.onFrameSnapshot(snapshot3); + }); + await Promise.all(snapshots); + } + _onPage(page) { + for (const frame of page.frames()) + this._annotateFrameHierarchy(frame); + } + _annotateFrameHierarchy(frame) { + (async () => { + const frameElement = await frame.frameElement(nullProgress); + const parent = frame.parentFrame(); + if (!parent) + return; + const context2 = await parent.mainContext(); + await context2?.evaluate(({ snapshotStreamer, frameElement: frameElement2, frameId }) => { + window[snapshotStreamer].markIframe(frameElement2, frameId); + }, { snapshotStreamer: this._snapshotStreamer, frameElement, frameId: frame.guid }); + frameElement.dispose(); + })().catch(() => { + }); + } + }; + kNeedsResetSymbol = /* @__PURE__ */ Symbol("kNeedsReset"); + } +}); + +// packages/playwright-core/src/server/artifact.ts +var import_fs12, Artifact; +var init_artifact = __esm({ + "packages/playwright-core/src/server/artifact.ts"() { + "use strict"; + import_fs12 = __toESM(require("fs")); + init_manualPromise(); + init_assert(); + init_errors(); + init_instrumentation(); + Artifact = class extends SdkObject { + constructor(parent, localPath, unaccessibleErrorMessage, cancelCallback) { + super(parent, "artifact"); + this._finishedPromise = new ManualPromise(); + this._saveCallbacks = []; + this._finished = false; + this._deleted = false; + this._localPath = localPath; + this._unaccessibleErrorMessage = unaccessibleErrorMessage; + this._cancelCallback = cancelCallback; + } + async localPathAfterFinished(progress2) { + return await progress2.race(this._localPathAfterFinished()); + } + async failureError(progress2) { + return await progress2.race(this._failureError()); + } + async cancel(progress2) { + return await progress2.race(this._cancel()); + } + async delete(progress2) { + return await progress2.race(this._delete()); + } + localPath() { + return this._localPath; + } + async _localPathAfterFinished() { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + await this._finishedPromise; + if (this._failureErrorValue) + throw this._failureErrorValue; + return this._localPath; + } + saveAs(progress2, saveCallback) { + if (this._unaccessibleErrorMessage) + throw new Error(this._unaccessibleErrorMessage); + if (this._deleted) + throw new Error(`File already deleted. Save before deleting.`); + if (this._failureErrorValue) + throw this._failureErrorValue; + if (this._finished) { + saveCallback(this._localPath).catch(() => { + }); + return; + } + this._saveCallbacks.push(saveCallback); + } + async _failureError() { + if (this._unaccessibleErrorMessage) + return this._unaccessibleErrorMessage; + await this._finishedPromise; + return this._failureErrorValue?.message || null; + } + async _cancel() { + assert(this._cancelCallback !== void 0); + return this._cancelCallback(); + } + async _delete() { + if (this._unaccessibleErrorMessage) + return; + const fileName = await this._localPathAfterFinished(); + if (this._deleted) + return; + this._deleted = true; + if (fileName) + await import_fs12.default.promises.unlink(fileName).catch((e) => { + }); + } + async deleteOnContextClose() { + if (this._deleted) + return; + this._deleted = true; + if (!this._unaccessibleErrorMessage) + await import_fs12.default.promises.unlink(this._localPath).catch((e) => { + }); + await this.reportFinished(new TargetClosedError(this.closeReason())); + } + async reportFinished(error) { + if (this._finished) + return; + this._finished = true; + this._failureErrorValue = error; + if (error) { + for (const callback of this._saveCallbacks) + await callback("", error); + } else { + for (const callback of this._saveCallbacks) + await callback(this._localPath); + } + this._saveCallbacks = []; + this._finishedPromise.resolve(); + } + }; + } +}); + +// packages/protocol/src/validatorPrimitives.ts +function findValidator(type3, method, kind) { + const validator = maybeFindValidator(type3, method, kind); + if (!validator) + throw new ValidationError(`Unknown scheme for ${kind}: ${type3}.${method}`); + return validator; +} +function maybeFindValidator(type3, method, kind) { + const schemeName = type3 + (kind === "Initializer" ? "" : method[0].toUpperCase() + method.substring(1)) + kind; + return scheme[schemeName]; +} +function createMetadataValidator() { + return tOptional(scheme["Metadata"]); +} +function createWaitInfoValidator() { + return scheme["WaitInfo"]; +} +var ValidationError, scheme, tFloat, tInt, tBoolean, tString, tBinary, tAny, tOptional, tArray, tObject, tEnum, tChannel, tType; +var init_validatorPrimitives = __esm({ + "packages/protocol/src/validatorPrimitives.ts"() { + "use strict"; + ValidationError = class extends Error { + }; + scheme = {}; + tFloat = (arg, path66, context2) => { + if (arg instanceof Number) + return arg.valueOf(); + if (typeof arg === "number") + return arg; + throw new ValidationError(`${path66}: expected float, got ${typeof arg}`); + }; + tInt = (arg, path66, context2) => { + let value2; + if (arg instanceof Number) + value2 = arg.valueOf(); + else if (typeof arg === "number") + value2 = arg; + else + throw new ValidationError(`${path66}: expected integer, got ${typeof arg}`); + if (!Number.isInteger(value2)) + throw new ValidationError(`${path66}: expected integer, got float ${value2}`); + return value2; + }; + tBoolean = (arg, path66, context2) => { + if (arg instanceof Boolean) + return arg.valueOf(); + if (typeof arg === "boolean") + return arg; + throw new ValidationError(`${path66}: expected boolean, got ${typeof arg}`); + }; + tString = (arg, path66, context2) => { + if (arg instanceof String) + return arg.valueOf(); + if (typeof arg === "string") + return arg; + throw new ValidationError(`${path66}: expected string, got ${typeof arg}`); + }; + tBinary = (arg, path66, context2) => { + if (context2.binary === "fromBase64") { + if (arg instanceof String) + return Buffer.from(arg.valueOf(), "base64"); + if (typeof arg === "string") + return Buffer.from(arg, "base64"); + throw new ValidationError(`${path66}: expected base64-encoded buffer, got ${typeof arg}`); + } + if (context2.binary === "toBase64") { + if (!(arg instanceof Buffer)) + throw new ValidationError(`${path66}: expected Buffer, got ${typeof arg}`); + return arg.toString("base64"); + } + if (context2.binary === "buffer") { + if (!(arg instanceof Buffer) && !(arg instanceof Object)) + throw new ValidationError(`${path66}: expected Buffer, got ${typeof arg}`); + return arg; + } + throw new ValidationError(`Unsupported binary behavior "${context2.binary}"`); + }; + tAny = (arg, path66, context2) => { + return arg; + }; + tOptional = (v) => { + return (arg, path66, context2) => { + if (Object.is(arg, void 0)) + return arg; + return v(arg, path66, context2); + }; + }; + tArray = (v) => { + return (arg, path66, context2) => { + if (!Array.isArray(arg)) + throw new ValidationError(`${path66}: expected array, got ${typeof arg}`); + return arg.map((x, index) => v(x, path66 + "[" + index + "]", context2)); + }; + }; + tObject = (s) => { + return (arg, path66, context2) => { + if (Object.is(arg, null)) + throw new ValidationError(`${path66}: expected object, got null`); + if (typeof arg !== "object") + throw new ValidationError(`${path66}: expected object, got ${typeof arg}`); + const result2 = {}; + for (const [key, v] of Object.entries(s)) { + const value2 = v(arg[key], path66 ? path66 + "." + key : key, context2); + if (!Object.is(value2, void 0)) + result2[key] = value2; + } + if (context2.isUnderTest()) { + for (const [key, value2] of Object.entries(arg)) { + if (key.startsWith("__testHook")) + result2[key] = value2; + } + } + return result2; + }; + }; + tEnum = (e) => { + return (arg, path66, context2) => { + if (!e.includes(arg)) + throw new ValidationError(`${path66}: expected one of (${e.join("|")})`); + return arg; + }; + }; + tChannel = (names) => { + return (arg, path66, context2) => { + return context2.tChannelImpl(names, arg, path66, context2); + }; + }; + tType = (name) => { + return (arg, path66, context2) => { + const v = scheme[name]; + if (!v) + throw new ValidationError(path66 + ': unknown type "' + name + '"'); + return v(arg, path66, context2); + }; + }; + } +}); + +// packages/protocol/src/validator.ts +var init_validator = __esm({ + "packages/protocol/src/validator.ts"() { + "use strict"; + init_validatorPrimitives(); + init_validatorPrimitives(); + scheme.AndroidInitializer = tOptional(tObject({})); + scheme.AndroidDevicesParams = tObject({ + host: tOptional(tString), + port: tOptional(tInt), + omitDriverInstall: tOptional(tBoolean) + }); + scheme.AndroidDevicesResult = tObject({ + devices: tArray(tChannel(["AndroidDevice"])) + }); + scheme.AndroidSocketInitializer = tOptional(tObject({})); + scheme.AndroidSocketDataEvent = tObject({ + data: tBinary + }); + scheme.AndroidSocketCloseEvent = tOptional(tObject({})); + scheme.AndroidSocketWriteParams = tObject({ + data: tBinary + }); + scheme.AndroidSocketWriteResult = tOptional(tObject({})); + scheme.AndroidSocketCloseParams = tOptional(tObject({})); + scheme.AndroidSocketCloseResult = tOptional(tObject({})); + scheme.AndroidDeviceInitializer = tObject({ + model: tString, + serial: tString + }); + scheme.AndroidDeviceCloseEvent = tOptional(tObject({})); + scheme.AndroidDeviceWebViewAddedEvent = tObject({ + webView: tType("AndroidWebView") + }); + scheme.AndroidDeviceWebViewRemovedEvent = tObject({ + socketName: tString + }); + scheme.AndroidDeviceWaitParams = tObject({ + androidSelector: tType("AndroidSelector"), + state: tOptional(tEnum(["gone"])) + }); + scheme.AndroidDeviceWaitResult = tOptional(tObject({})); + scheme.AndroidDeviceFillParams = tObject({ + androidSelector: tType("AndroidSelector"), + text: tString + }); + scheme.AndroidDeviceFillResult = tOptional(tObject({})); + scheme.AndroidDeviceTapParams = tObject({ + androidSelector: tType("AndroidSelector"), + duration: tOptional(tFloat) + }); + scheme.AndroidDeviceTapResult = tOptional(tObject({})); + scheme.AndroidDeviceDragParams = tObject({ + androidSelector: tType("AndroidSelector"), + dest: tType("Point"), + speed: tOptional(tFloat) + }); + scheme.AndroidDeviceDragResult = tOptional(tObject({})); + scheme.AndroidDeviceFlingParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + speed: tOptional(tFloat) + }); + scheme.AndroidDeviceFlingResult = tOptional(tObject({})); + scheme.AndroidDeviceLongTapParams = tObject({ + androidSelector: tType("AndroidSelector") + }); + scheme.AndroidDeviceLongTapResult = tOptional(tObject({})); + scheme.AndroidDevicePinchCloseParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tFloat, + speed: tOptional(tFloat) + }); + scheme.AndroidDevicePinchCloseResult = tOptional(tObject({})); + scheme.AndroidDevicePinchOpenParams = tObject({ + androidSelector: tType("AndroidSelector"), + percent: tFloat, + speed: tOptional(tFloat) + }); + scheme.AndroidDevicePinchOpenResult = tOptional(tObject({})); + scheme.AndroidDeviceScrollParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tFloat, + speed: tOptional(tFloat) + }); + scheme.AndroidDeviceScrollResult = tOptional(tObject({})); + scheme.AndroidDeviceSwipeParams = tObject({ + androidSelector: tType("AndroidSelector"), + direction: tEnum(["up", "down", "left", "right"]), + percent: tFloat, + speed: tOptional(tFloat) + }); + scheme.AndroidDeviceSwipeResult = tOptional(tObject({})); + scheme.AndroidDeviceInfoParams = tObject({ + androidSelector: tType("AndroidSelector") + }); + scheme.AndroidDeviceInfoResult = tObject({ + info: tType("AndroidElementInfo") + }); + scheme.AndroidDeviceScreenshotParams = tOptional(tObject({})); + scheme.AndroidDeviceScreenshotResult = tObject({ + binary: tBinary + }); + scheme.AndroidDeviceInputTypeParams = tObject({ + text: tString + }); + scheme.AndroidDeviceInputTypeResult = tOptional(tObject({})); + scheme.AndroidDeviceInputPressParams = tObject({ + key: tString + }); + scheme.AndroidDeviceInputPressResult = tOptional(tObject({})); + scheme.AndroidDeviceInputTapParams = tObject({ + point: tType("Point") + }); + scheme.AndroidDeviceInputTapResult = tOptional(tObject({})); + scheme.AndroidDeviceInputSwipeParams = tObject({ + segments: tArray(tType("Point")), + steps: tInt + }); + scheme.AndroidDeviceInputSwipeResult = tOptional(tObject({})); + scheme.AndroidDeviceInputDragParams = tObject({ + from: tType("Point"), + to: tType("Point"), + steps: tInt + }); + scheme.AndroidDeviceInputDragResult = tOptional(tObject({})); + scheme.AndroidDeviceLaunchBrowserParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + pkg: tOptional(tString), + args: tOptional(tArray(tString)), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })) + }); + scheme.AndroidDeviceLaunchBrowserResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.AndroidDeviceOpenParams = tObject({ + command: tString + }); + scheme.AndroidDeviceOpenResult = tObject({ + socket: tChannel(["AndroidSocket"]) + }); + scheme.AndroidDeviceShellParams = tObject({ + command: tString + }); + scheme.AndroidDeviceShellResult = tObject({ + result: tBinary + }); + scheme.AndroidDeviceInstallApkParams = tObject({ + file: tBinary, + args: tOptional(tArray(tString)) + }); + scheme.AndroidDeviceInstallApkResult = tOptional(tObject({})); + scheme.AndroidDevicePushParams = tObject({ + file: tBinary, + path: tString, + mode: tOptional(tInt) + }); + scheme.AndroidDevicePushResult = tOptional(tObject({})); + scheme.AndroidDeviceConnectToWebViewParams = tObject({ + socketName: tString + }); + scheme.AndroidDeviceConnectToWebViewResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.AndroidDeviceCloseParams = tOptional(tObject({})); + scheme.AndroidDeviceCloseResult = tOptional(tObject({})); + scheme.AndroidWebView = tObject({ + pid: tInt, + pkg: tString, + socketName: tString + }); + scheme.AndroidSelector = tObject({ + checkable: tOptional(tBoolean), + checked: tOptional(tBoolean), + clazz: tOptional(tString), + clickable: tOptional(tBoolean), + depth: tOptional(tInt), + desc: tOptional(tString), + enabled: tOptional(tBoolean), + focusable: tOptional(tBoolean), + focused: tOptional(tBoolean), + hasChild: tOptional(tObject({ + androidSelector: tType("AndroidSelector") + })), + hasDescendant: tOptional(tObject({ + androidSelector: tType("AndroidSelector"), + maxDepth: tOptional(tInt) + })), + longClickable: tOptional(tBoolean), + pkg: tOptional(tString), + res: tOptional(tString), + scrollable: tOptional(tBoolean), + selected: tOptional(tBoolean), + text: tOptional(tString) + }); + scheme.AndroidElementInfo = tObject({ + children: tOptional(tArray(tType("AndroidElementInfo"))), + clazz: tString, + desc: tString, + res: tString, + pkg: tString, + text: tString, + bounds: tType("Rect"), + checkable: tBoolean, + checked: tBoolean, + clickable: tBoolean, + enabled: tBoolean, + focusable: tBoolean, + focused: tBoolean, + longClickable: tBoolean, + scrollable: tBoolean, + selected: tBoolean + }); + scheme.APIRequestContextInitializer = tObject({ + tracing: tChannel(["Tracing"]) + }); + scheme.APIRequestContextFetchParams = tObject({ + url: tString, + encodedParams: tOptional(tString), + params: tOptional(tArray(tType("NameValue"))), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + jsonData: tOptional(tString), + formData: tOptional(tArray(tType("NameValue"))), + multipartData: tOptional(tArray(tType("FormField"))), + failOnStatusCode: tOptional(tBoolean), + ignoreHTTPSErrors: tOptional(tBoolean), + maxRedirects: tOptional(tInt), + maxRetries: tOptional(tInt) + }); + scheme.APIRequestContextFetchResult = tObject({ + response: tType("APIResponse") + }); + scheme.APIRequestContextFetchResponseBodyParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextFetchResponseBodyResult = tObject({ + binary: tOptional(tBinary) + }); + scheme.APIRequestContextFetchLogParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextFetchLogResult = tObject({ + log: tArray(tString) + }); + scheme.APIRequestContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean) + }); + scheme.APIRequestContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")) + }); + scheme.APIRequestContextDisposeAPIResponseParams = tObject({ + fetchUid: tString + }); + scheme.APIRequestContextDisposeAPIResponseResult = tOptional(tObject({})); + scheme.APIRequestContextDisposeParams = tObject({ + reason: tOptional(tString) + }); + scheme.APIRequestContextDisposeResult = tOptional(tObject({})); + scheme.APIResponse = tObject({ + fetchUid: tString, + url: tString, + status: tInt, + statusText: tString, + headers: tArray(tType("NameValue")), + securityDetails: tOptional(tType("SecurityDetails")), + serverAddr: tOptional(tType("RemoteAddr")), + timing: tOptional(tType("ResourceTiming")), + responseEndTiming: tOptional(tFloat) + }); + scheme.ArtifactInitializer = tObject({ + absolutePath: tString + }); + scheme.ArtifactPathAfterFinishedParams = tOptional(tObject({})); + scheme.ArtifactPathAfterFinishedResult = tObject({ + value: tString + }); + scheme.ArtifactSaveAsParams = tObject({ + path: tString + }); + scheme.ArtifactSaveAsResult = tOptional(tObject({})); + scheme.ArtifactSaveAsStreamParams = tOptional(tObject({})); + scheme.ArtifactSaveAsStreamResult = tObject({ + stream: tChannel(["Stream"]) + }); + scheme.ArtifactFailureParams = tOptional(tObject({})); + scheme.ArtifactFailureResult = tObject({ + error: tOptional(tString) + }); + scheme.ArtifactStreamParams = tOptional(tObject({})); + scheme.ArtifactStreamResult = tObject({ + stream: tChannel(["Stream"]) + }); + scheme.ArtifactCancelParams = tOptional(tObject({})); + scheme.ArtifactCancelResult = tOptional(tObject({})); + scheme.ArtifactDeleteParams = tOptional(tObject({})); + scheme.ArtifactDeleteResult = tOptional(tObject({})); + scheme.StreamInitializer = tOptional(tObject({})); + scheme.StreamReadParams = tObject({ + size: tOptional(tInt) + }); + scheme.StreamReadResult = tObject({ + binary: tBinary + }); + scheme.StreamCloseParams = tOptional(tObject({})); + scheme.StreamCloseResult = tOptional(tObject({})); + scheme.WritableStreamInitializer = tOptional(tObject({})); + scheme.WritableStreamWriteParams = tObject({ + binary: tBinary + }); + scheme.WritableStreamWriteResult = tOptional(tObject({})); + scheme.WritableStreamCloseParams = tOptional(tObject({})); + scheme.WritableStreamCloseResult = tOptional(tObject({})); + scheme.BrowserInitializer = tObject({ + version: tString, + name: tString, + browserName: tEnum(["chromium", "firefox", "webkit"]) + }); + scheme.BrowserContextEvent = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserCloseEvent = tOptional(tObject({})); + scheme.BrowserStartServerParams = tObject({ + title: tString, + workspaceDir: tOptional(tString), + metadata: tOptional(tAny), + host: tOptional(tString), + port: tOptional(tInt) + }); + scheme.BrowserStartServerResult = tObject({ + endpoint: tString + }); + scheme.BrowserStopServerParams = tOptional(tObject({})); + scheme.BrowserStopServerResult = tOptional(tObject({})); + scheme.BrowserCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.BrowserCloseResult = tOptional(tObject({})); + scheme.BrowserKillForTestsParams = tOptional(tObject({})); + scheme.BrowserKillForTestsResult = tOptional(tObject({})); + scheme.BrowserDefaultUserAgentForTestParams = tOptional(tObject({})); + scheme.BrowserDefaultUserAgentForTestResult = tObject({ + userAgent: tString + }); + scheme.BrowserNewContextParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))), + credentials: tOptional(tArray(tType("VirtualCredential"))) + })) + }); + scheme.BrowserNewContextResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserNewContextForReuseParams = tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))), + credentials: tOptional(tArray(tType("VirtualCredential"))) + })) + }); + scheme.BrowserNewContextForReuseResult = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserDisconnectFromReusedContextParams = tObject({ + reason: tString + }); + scheme.BrowserDisconnectFromReusedContextResult = tOptional(tObject({})); + scheme.BrowserNewBrowserCDPSessionParams = tOptional(tObject({})); + scheme.BrowserNewBrowserCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) + }); + scheme.BrowserStartTracingParams = tObject({ + page: tOptional(tChannel(["Page"])), + screenshots: tOptional(tBoolean), + categories: tOptional(tArray(tString)) + }); + scheme.BrowserStartTracingResult = tOptional(tObject({})); + scheme.BrowserStopTracingParams = tOptional(tObject({})); + scheme.BrowserStopTracingResult = tObject({ + artifact: tChannel(["Artifact"]) + }); + scheme.BrowserContextInitializer = tObject({ + debugger: tChannel(["Debugger"]), + requestContext: tChannel(["APIRequestContext"]), + tracing: tChannel(["Tracing"]), + options: tObject({ + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) + }) + }); + scheme.BrowserContextBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) + }); + scheme.BrowserContextConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat, + page: tOptional(tChannel(["Page"])), + worker: tOptional(tChannel(["Worker"])) + }); + scheme.BrowserContextCloseEvent = tOptional(tObject({})); + scheme.BrowserContextDialogEvent = tObject({ + dialog: tChannel(["Dialog"]) + }); + scheme.BrowserContextPageEvent = tObject({ + page: tChannel(["Page"]) + }); + scheme.BrowserContextPageErrorEvent = tObject({ + error: tType("SerializedError"), + page: tChannel(["Page"]), + location: tObject({ + url: tString, + line: tInt, + column: tInt + }) + }); + scheme.BrowserContextRouteEvent = tObject({ + route: tChannel(["Route"]) + }); + scheme.BrowserContextWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) + }); + scheme.BrowserContextServiceWorkerEvent = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.BrowserContextRequestEvent = tObject({ + request: tChannel(["Request"]), + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRequestFailedEvent = tObject({ + request: tChannel(["Request"]), + failureText: tOptional(tString), + responseEndTiming: tFloat, + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRequestFinishedEvent = tObject({ + request: tChannel(["Request"]), + response: tOptional(tChannel(["Response"])), + responseEndTiming: tFloat, + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextResponseEvent = tObject({ + response: tChannel(["Response"]), + page: tOptional(tChannel(["Page"])) + }); + scheme.BrowserContextRecorderEventEvent = tObject({ + event: tEnum(["actionAdded", "actionUpdated", "signalAdded"]), + data: tAny, + page: tChannel(["Page"]), + code: tString + }); + scheme.BrowserContextAddCookiesParams = tObject({ + cookies: tArray(tType("SetNetworkCookie")) + }); + scheme.BrowserContextAddCookiesResult = tOptional(tObject({})); + scheme.BrowserContextAddInitScriptParams = tObject({ + source: tString + }); + scheme.BrowserContextAddInitScriptResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.BrowserContextClearCookiesParams = tObject({ + name: tOptional(tString), + nameRegexSource: tOptional(tString), + nameRegexFlags: tOptional(tString), + domain: tOptional(tString), + domainRegexSource: tOptional(tString), + domainRegexFlags: tOptional(tString), + path: tOptional(tString), + pathRegexSource: tOptional(tString), + pathRegexFlags: tOptional(tString) + }); + scheme.BrowserContextClearCookiesResult = tOptional(tObject({})); + scheme.BrowserContextClearPermissionsParams = tOptional(tObject({})); + scheme.BrowserContextClearPermissionsResult = tOptional(tObject({})); + scheme.BrowserContextCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.BrowserContextCloseResult = tOptional(tObject({})); + scheme.BrowserContextCookiesParams = tObject({ + urls: tArray(tString) + }); + scheme.BrowserContextCookiesResult = tObject({ + cookies: tArray(tType("NetworkCookie")) + }); + scheme.BrowserContextExposeBindingParams = tObject({ + name: tString, + noGlobal: tOptional(tBoolean) + }); + scheme.BrowserContextExposeBindingResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.BrowserContextGrantPermissionsParams = tObject({ + permissions: tArray(tString), + origin: tOptional(tString) + }); + scheme.BrowserContextGrantPermissionsResult = tOptional(tObject({})); + scheme.BrowserContextNewPageParams = tOptional(tObject({})); + scheme.BrowserContextNewPageResult = tObject({ + page: tChannel(["Page"]) + }); + scheme.BrowserContextRegisterSelectorEngineParams = tObject({ + selectorEngine: tType("SelectorEngine") + }); + scheme.BrowserContextRegisterSelectorEngineResult = tOptional(tObject({})); + scheme.BrowserContextSetTestIdAttributeNameParams = tObject({ + testIdAttributeName: tString + }); + scheme.BrowserContextSetTestIdAttributeNameResult = tOptional(tObject({})); + scheme.BrowserContextSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.BrowserContextSetExtraHTTPHeadersResult = tOptional(tObject({})); + scheme.BrowserContextSetGeolocationParams = tObject({ + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })) + }); + scheme.BrowserContextSetGeolocationResult = tOptional(tObject({})); + scheme.BrowserContextSetHTTPCredentialsParams = tObject({ + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })) + }); + scheme.BrowserContextSetHTTPCredentialsResult = tOptional(tObject({})); + scheme.BrowserContextSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.BrowserContextSetNetworkInterceptionPatternsResult = tOptional(tObject({})); + scheme.BrowserContextSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.BrowserContextSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); + scheme.BrowserContextSetOfflineParams = tObject({ + offline: tBoolean + }); + scheme.BrowserContextSetOfflineResult = tOptional(tObject({})); + scheme.BrowserContextStorageStateParams = tObject({ + indexedDB: tOptional(tBoolean), + credentials: tOptional(tBoolean) + }); + scheme.BrowserContextStorageStateResult = tObject({ + cookies: tArray(tType("NetworkCookie")), + origins: tArray(tType("OriginStorage")), + credentials: tOptional(tArray(tType("VirtualCredential"))) + }); + scheme.BrowserContextSetStorageStateParams = tObject({ + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("SetNetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))), + credentials: tOptional(tArray(tType("VirtualCredential"))) + })) + }); + scheme.BrowserContextSetStorageStateResult = tOptional(tObject({})); + scheme.BrowserContextPauseParams = tOptional(tObject({})); + scheme.BrowserContextPauseResult = tOptional(tObject({})); + scheme.BrowserContextEnableRecorderParams = tObject({ + language: tOptional(tString), + mode: tOptional(tEnum(["inspecting", "recording"])), + recorderMode: tOptional(tEnum(["default", "api"])), + pauseOnNextStatement: tOptional(tBoolean), + testIdAttributeName: tOptional(tString), + launchOptions: tOptional(tAny), + contextOptions: tOptional(tAny), + device: tOptional(tString), + saveStorage: tOptional(tString), + outputFile: tOptional(tString), + handleSIGINT: tOptional(tBoolean), + omitCallTracking: tOptional(tBoolean) + }); + scheme.BrowserContextEnableRecorderResult = tOptional(tObject({})); + scheme.BrowserContextDisableRecorderParams = tOptional(tObject({})); + scheme.BrowserContextDisableRecorderResult = tOptional(tObject({})); + scheme.BrowserContextExposeConsoleApiParams = tOptional(tObject({})); + scheme.BrowserContextExposeConsoleApiResult = tOptional(tObject({})); + scheme.BrowserContextNewCDPSessionParams = tObject({ + page: tOptional(tChannel(["Page"])), + frame: tOptional(tChannel(["Frame"])) + }); + scheme.BrowserContextNewCDPSessionResult = tObject({ + session: tChannel(["CDPSession"]) + }); + scheme.BrowserContextCreateTempFilesParams = tObject({ + rootDirName: tOptional(tString), + items: tArray(tObject({ + name: tString, + lastModifiedMs: tOptional(tFloat) + })) + }); + scheme.BrowserContextCreateTempFilesResult = tObject({ + rootDir: tOptional(tChannel(["WritableStream"])), + writableStreams: tArray(tChannel(["WritableStream"])) + }); + scheme.BrowserContextUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean + }); + scheme.BrowserContextUpdateSubscriptionResult = tOptional(tObject({})); + scheme.BrowserContextClockFastForwardParams = tObject({ + ticksNumber: tOptional(tFloat), + ticksString: tOptional(tString) + }); + scheme.BrowserContextClockFastForwardResult = tOptional(tObject({})); + scheme.BrowserContextClockInstallParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockInstallResult = tOptional(tObject({})); + scheme.BrowserContextClockPauseAtParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockPauseAtResult = tOptional(tObject({})); + scheme.BrowserContextClockResumeParams = tOptional(tObject({})); + scheme.BrowserContextClockResumeResult = tOptional(tObject({})); + scheme.BrowserContextClockRunForParams = tObject({ + ticksNumber: tOptional(tFloat), + ticksString: tOptional(tString) + }); + scheme.BrowserContextClockRunForResult = tOptional(tObject({})); + scheme.BrowserContextClockSetFixedTimeParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockSetFixedTimeResult = tOptional(tObject({})); + scheme.BrowserContextClockSetSystemTimeParams = tObject({ + timeNumber: tOptional(tFloat), + timeString: tOptional(tString) + }); + scheme.BrowserContextClockSetSystemTimeResult = tOptional(tObject({})); + scheme.BrowserContextCredentialsInstallParams = tOptional(tObject({})); + scheme.BrowserContextCredentialsInstallResult = tOptional(tObject({})); + scheme.BrowserContextCredentialsCreateParams = tObject({ + rpId: tString, + id: tOptional(tString), + userHandle: tOptional(tString), + privateKey: tOptional(tString), + publicKey: tOptional(tString) + }); + scheme.BrowserContextCredentialsCreateResult = tObject({ + credential: tType("VirtualCredential") + }); + scheme.BrowserContextCredentialsGetParams = tObject({ + rpId: tOptional(tString), + id: tOptional(tString) + }); + scheme.BrowserContextCredentialsGetResult = tObject({ + credentials: tArray(tType("VirtualCredential")) + }); + scheme.BrowserContextCredentialsDeleteParams = tObject({ + id: tString + }); + scheme.BrowserContextCredentialsDeleteResult = tOptional(tObject({})); + scheme.BrowserTypeInitializer = tObject({ + executablePath: tString, + name: tString + }); + scheme.BrowserTypeLaunchParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tInt), + slowMo: tOptional(tFloat) + }); + scheme.BrowserTypeLaunchResult = tObject({ + browser: tChannel(["Browser"]) + }); + scheme.BrowserTypeLaunchPersistentContextParams = tObject({ + channel: tOptional(tString), + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + ignoreAllDefaultArgs: tOptional(tBoolean), + ignoreDefaultArgs: tOptional(tArray(tString)), + handleSIGINT: tOptional(tBoolean), + handleSIGTERM: tOptional(tBoolean), + handleSIGHUP: tOptional(tBoolean), + env: tOptional(tArray(tType("NameValue"))), + headless: tOptional(tBoolean), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + downloadsPath: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + chromiumSandbox: tOptional(tBoolean), + firefoxUserPrefs: tOptional(tAny), + cdpPort: tOptional(tInt), + noDefaultViewport: tOptional(tBoolean), + viewport: tOptional(tObject({ + width: tInt, + height: tInt + })), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + ignoreHTTPSErrors: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + javaScriptEnabled: tOptional(tBoolean), + bypassCSP: tOptional(tBoolean), + userAgent: tOptional(tString), + locale: tOptional(tString), + timezoneId: tOptional(tString), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + permissions: tOptional(tArray(tString)), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + offline: tOptional(tBoolean), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + deviceScaleFactor: tOptional(tFloat), + isMobile: tOptional(tBoolean), + hasTouch: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])), + baseURL: tOptional(tString), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + serviceWorkers: tOptional(tEnum(["allow", "block"])), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString), + userDataDir: tString, + slowMo: tOptional(tFloat) + }); + scheme.BrowserTypeLaunchPersistentContextResult = tObject({ + browser: tChannel(["Browser"]), + context: tChannel(["BrowserContext"]) + }); + scheme.BrowserTypeConnectOverCDPParams = tObject({ + endpointURL: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + slowMo: tOptional(tFloat), + isLocal: tOptional(tBoolean), + noDefaults: tOptional(tBoolean), + artifactsDir: tOptional(tString), + transport: tOptional(tBinary) + }); + scheme.BrowserTypeConnectOverCDPResult = tObject({ + browser: tChannel(["Browser"]), + defaultContext: tOptional(tChannel(["BrowserContext"])) + }); + scheme.BrowserTypeConnectToWorkerParams = tObject({ + endpoint: tString + }); + scheme.BrowserTypeConnectToWorkerResult = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.Metadata = tObject({ + location: tOptional(tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + })), + title: tOptional(tString), + internal: tOptional(tBoolean), + stepId: tOptional(tString), + timeout: tOptional(tFloat) + }); + scheme.ClientSideCallMetadata = tObject({ + id: tInt, + stack: tOptional(tArray(tType("StackFrame"))) + }); + scheme.SDKLanguage = tEnum(["javascript", "python", "java", "csharp"]); + scheme.DisposableInitializer = tOptional(tObject({})); + scheme.DisposableDisposeParams = tOptional(tObject({})); + scheme.DisposableDisposeResult = tOptional(tObject({})); + scheme.WaitInfo = tObject({ + waitId: tString, + phase: tEnum(["before", "after", "log"]), + event: tOptional(tString), + message: tOptional(tString), + error: tOptional(tString) + }); + scheme.ElectronInitializer = tOptional(tObject({})); + scheme.ElectronLaunchParams = tObject({ + executablePath: tOptional(tString), + args: tOptional(tArray(tString)), + chromiumSandbox: tOptional(tBoolean), + cwd: tOptional(tString), + env: tOptional(tArray(tType("NameValue"))), + acceptDownloads: tOptional(tEnum(["accept", "deny", "internal-browser-default"])), + bypassCSP: tOptional(tBoolean), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + geolocation: tOptional(tObject({ + longitude: tFloat, + latitude: tFloat, + accuracy: tOptional(tFloat) + })), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString) + })), + ignoreHTTPSErrors: tOptional(tBoolean), + locale: tOptional(tString), + offline: tOptional(tBoolean), + recordVideo: tOptional(tObject({ + dir: tOptional(tString), + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + showActions: tOptional(tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + })) + })), + strictSelectors: tOptional(tBoolean), + timezoneId: tOptional(tString), + tracesDir: tOptional(tString), + artifactsDir: tOptional(tString), + selectorEngines: tOptional(tArray(tType("SelectorEngine"))), + testIdAttributeName: tOptional(tString) + }); + scheme.ElectronLaunchResult = tObject({ + electronApplication: tChannel(["ElectronApplication"]) + }); + scheme.ElectronApplicationInitializer = tObject({ + context: tChannel(["BrowserContext"]) + }); + scheme.ElectronApplicationCloseEvent = tOptional(tObject({})); + scheme.ElectronApplicationConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + }); + scheme.ElectronApplicationBrowserWindowParams = tObject({ + page: tChannel(["Page"]) + }); + scheme.ElectronApplicationBrowserWindowResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElectronApplicationEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElectronApplicationEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElectronApplicationEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElectronApplicationEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElectronApplicationUpdateSubscriptionParams = tObject({ + event: tEnum(["console"]), + enabled: tBoolean + }); + scheme.ElectronApplicationUpdateSubscriptionResult = tOptional(tObject({})); + scheme.FrameInitializer = tObject({ + url: tString, + name: tString, + parentFrame: tOptional(tChannel(["Frame"])), + loadStates: tArray(tType("LifecycleEvent")) + }); + scheme.FrameLoadstateEvent = tObject({ + add: tOptional(tType("LifecycleEvent")), + remove: tOptional(tType("LifecycleEvent")) + }); + scheme.FrameNavigatedEvent = tObject({ + url: tString, + name: tString, + newDocument: tOptional(tObject({ + request: tOptional(tChannel(["Request"])) + })), + error: tOptional(tString) + }); + scheme.FrameEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameAddScriptTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString), + type: tOptional(tString) + }); + scheme.FrameAddScriptTagResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameAddStyleTagParams = tObject({ + url: tOptional(tString), + content: tOptional(tString) + }); + scheme.FrameAddStyleTagResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameAriaSnapshotParams = tObject({ + mode: tOptional(tEnum(["ai", "default"])), + selector: tOptional(tString), + depth: tOptional(tInt), + boxes: tOptional(tBoolean) + }); + scheme.FrameAriaSnapshotResult = tObject({ + snapshot: tString + }); + scheme.FrameBlurParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameBlurResult = tOptional(tObject({})); + scheme.FrameCheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.FrameCheckResult = tOptional(tObject({})); + scheme.FrameClickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt), + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameClickResult = tOptional(tObject({})); + scheme.FrameContentParams = tOptional(tObject({})); + scheme.FrameContentResult = tObject({ + value: tString + }); + scheme.FrameDragAndDropParams = tObject({ + source: tString, + target: tString, + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + trial: tOptional(tBoolean), + sourcePosition: tOptional(tType("Point")), + targetPosition: tOptional(tType("Point")), + strict: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameDragAndDropResult = tOptional(tObject({})); + scheme.FrameDropParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + position: tOptional(tType("Point")), + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))), + data: tOptional(tArray(tObject({ + mimeType: tString, + value: tString + }))) + }); + scheme.FrameDropResult = tOptional(tObject({})); + scheme.FrameDblclickParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.FrameDblclickResult = tOptional(tObject({})); + scheme.FrameDispatchEventParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + type: tString, + eventInit: tType("SerializedArgument") + }); + scheme.FrameDispatchEventResult = tOptional(tObject({})); + scheme.FrameEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.FrameEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.FrameEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.FrameFillParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + value: tString, + force: tOptional(tBoolean) + }); + scheme.FrameFillResult = tOptional(tObject({})); + scheme.FrameFocusParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameFocusResult = tOptional(tObject({})); + scheme.FrameFrameElementParams = tOptional(tObject({})); + scheme.FrameFrameElementResult = tObject({ + element: tChannel(["ElementHandle"]) + }); + scheme.FrameResolveSelectorParams = tObject({ + selector: tString + }); + scheme.FrameResolveSelectorResult = tObject({ + resolvedSelector: tString + }); + scheme.FrameHighlightParams = tObject({ + selector: tString, + style: tOptional(tString) + }); + scheme.FrameHighlightResult = tOptional(tObject({})); + scheme.FrameHideHighlightParams = tObject({ + selector: tString + }); + scheme.FrameHideHighlightResult = tOptional(tObject({})); + scheme.FrameGetAttributeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + name: tString + }); + scheme.FrameGetAttributeResult = tObject({ + value: tOptional(tString) + }); + scheme.FrameGotoParams = tObject({ + url: tString, + waitUntil: tOptional(tType("LifecycleEvent")), + referer: tOptional(tString) + }); + scheme.FrameGotoResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.FrameHoverParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.FrameHoverResult = tOptional(tObject({})); + scheme.FrameInnerHTMLParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameInnerHTMLResult = tObject({ + value: tString + }); + scheme.FrameInnerTextParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameInnerTextResult = tObject({ + value: tString + }); + scheme.FrameInputValueParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameInputValueResult = tObject({ + value: tString + }); + scheme.FrameIsCheckedParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsCheckedResult = tObject({ + value: tBoolean + }); + scheme.FrameIsDisabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsDisabledResult = tObject({ + value: tBoolean + }); + scheme.FrameIsEnabledParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsEnabledResult = tObject({ + value: tBoolean + }); + scheme.FrameIsHiddenParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsHiddenResult = tObject({ + value: tBoolean + }); + scheme.FrameIsVisibleParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsVisibleResult = tObject({ + value: tBoolean + }); + scheme.FrameIsEditableParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameIsEditableResult = tObject({ + value: tBoolean + }); + scheme.FramePressParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + key: tString, + delay: tOptional(tFloat), + noWaitAfter: tOptional(tBoolean) + }); + scheme.FramePressResult = tOptional(tObject({})); + scheme.FrameQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.FrameQuerySelectorAllParams = tObject({ + selector: tString + }); + scheme.FrameQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) + }); + scheme.FrameQueryCountParams = tObject({ + selector: tString + }); + scheme.FrameQueryCountResult = tObject({ + value: tInt + }); + scheme.FrameSelectOptionParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tInt) + }))), + force: tOptional(tBoolean) + }); + scheme.FrameSelectOptionResult = tObject({ + values: tArray(tString) + }); + scheme.FrameSetContentParams = tObject({ + html: tString, + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.FrameSetContentResult = tOptional(tObject({})); + scheme.FrameSetInputFilesParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))) + }); + scheme.FrameSetInputFilesResult = tOptional(tObject({})); + scheme.FrameTapParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.FrameTapResult = tOptional(tObject({})); + scheme.FrameTextContentParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.FrameTextContentResult = tObject({ + value: tOptional(tString) + }); + scheme.FrameTitleParams = tOptional(tObject({})); + scheme.FrameTitleResult = tObject({ + value: tString + }); + scheme.FrameTypeParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + text: tString, + delay: tOptional(tFloat) + }); + scheme.FrameTypeResult = tOptional(tObject({})); + scheme.FrameUncheckParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.FrameUncheckResult = tOptional(tObject({})); + scheme.FrameWaitForTimeoutParams = tObject({ + waitTimeout: tFloat + }); + scheme.FrameWaitForTimeoutResult = tOptional(tObject({})); + scheme.FrameWaitForFunctionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument"), + pollingInterval: tOptional(tFloat), + selector: tOptional(tString), + strict: tOptional(tBoolean) + }); + scheme.FrameWaitForFunctionResult = tObject({ + handle: tOptional(tChannel(["ElementHandle", "JSHandle"])) + }); + scheme.FrameWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])), + omitReturnValue: tOptional(tBoolean) + }); + scheme.FrameWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.FrameExpectParams = tObject({ + selector: tOptional(tString), + expression: tString, + expressionArg: tOptional(tAny), + pseudo: tOptional(tEnum(["before", "after"])), + expectedText: tOptional(tArray(tType("ExpectedTextValue"))), + expectedNumber: tOptional(tFloat), + expectedValue: tOptional(tType("SerializedArgument")), + useInnerText: tOptional(tBoolean), + isNot: tBoolean + }); + scheme.FrameExpectResult = tOptional(tObject({})); + scheme.FrameExpectErrorDetails = tObject({ + received: tOptional(tObject({ + value: tOptional(tType("SerializedValue")), + ariaSnapshot: tOptional(tString) + })), + timedOut: tOptional(tBoolean), + customErrorMessage: tOptional(tString) + }); + scheme.JSHandleInitializer = tObject({ + preview: tString + }); + scheme.JSHandlePreviewUpdatedEvent = tObject({ + preview: tString + }); + scheme.ElementHandlePreviewUpdatedEvent = tType("JSHandlePreviewUpdatedEvent"); + scheme.JSHandleDisposeParams = tOptional(tObject({})); + scheme.ElementHandleDisposeParams = tType("JSHandleDisposeParams"); + scheme.JSHandleDisposeResult = tOptional(tObject({})); + scheme.ElementHandleDisposeResult = tType("JSHandleDisposeResult"); + scheme.JSHandleEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvaluateExpressionParams = tType("JSHandleEvaluateExpressionParams"); + scheme.JSHandleEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleEvaluateExpressionResult = tType("JSHandleEvaluateExpressionResult"); + scheme.JSHandleEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvaluateExpressionHandleParams = tType("JSHandleEvaluateExpressionHandleParams"); + scheme.JSHandleEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElementHandleEvaluateExpressionHandleResult = tType("JSHandleEvaluateExpressionHandleResult"); + scheme.JSHandleGetPropertyListParams = tOptional(tObject({})); + scheme.ElementHandleGetPropertyListParams = tType("JSHandleGetPropertyListParams"); + scheme.JSHandleGetPropertyListResult = tObject({ + properties: tArray(tObject({ + name: tString, + value: tChannel(["ElementHandle", "JSHandle"]) + })) + }); + scheme.ElementHandleGetPropertyListResult = tType("JSHandleGetPropertyListResult"); + scheme.JSHandleGetPropertyParams = tObject({ + name: tString + }); + scheme.ElementHandleGetPropertyParams = tType("JSHandleGetPropertyParams"); + scheme.JSHandleGetPropertyResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.ElementHandleGetPropertyResult = tType("JSHandleGetPropertyResult"); + scheme.JSHandleJsonValueParams = tOptional(tObject({})); + scheme.ElementHandleJsonValueParams = tType("JSHandleJsonValueParams"); + scheme.JSHandleJsonValueResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleJsonValueResult = tType("JSHandleJsonValueResult"); + scheme.ElementHandleInitializer = tObject({ + preview: tString + }); + scheme.ElementHandleEvalOnSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvalOnSelectorResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleEvalOnSelectorAllParams = tObject({ + selector: tString, + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.ElementHandleEvalOnSelectorAllResult = tObject({ + value: tType("SerializedValue") + }); + scheme.ElementHandleBoundingBoxParams = tOptional(tObject({})); + scheme.ElementHandleBoundingBoxResult = tObject({ + value: tOptional(tType("Rect")) + }); + scheme.ElementHandleCheckParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.ElementHandleCheckResult = tOptional(tObject({})); + scheme.ElementHandleClickParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + noWaitAfter: tOptional(tBoolean), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt), + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.ElementHandleClickResult = tOptional(tObject({})); + scheme.ElementHandleContentFrameParams = tOptional(tObject({})); + scheme.ElementHandleContentFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) + }); + scheme.ElementHandleDblclickParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + trial: tOptional(tBoolean), + steps: tOptional(tInt) + }); + scheme.ElementHandleDblclickResult = tOptional(tObject({})); + scheme.ElementHandleDispatchEventParams = tObject({ + type: tString, + eventInit: tType("SerializedArgument") + }); + scheme.ElementHandleDispatchEventResult = tOptional(tObject({})); + scheme.ElementHandleFillParams = tObject({ + value: tString, + force: tOptional(tBoolean) + }); + scheme.ElementHandleFillResult = tOptional(tObject({})); + scheme.ElementHandleFocusParams = tOptional(tObject({})); + scheme.ElementHandleFocusResult = tOptional(tObject({})); + scheme.ElementHandleGetAttributeParams = tObject({ + name: tString + }); + scheme.ElementHandleGetAttributeResult = tObject({ + value: tOptional(tString) + }); + scheme.ElementHandleHoverParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.ElementHandleHoverResult = tOptional(tObject({})); + scheme.ElementHandleInnerHTMLParams = tOptional(tObject({})); + scheme.ElementHandleInnerHTMLResult = tObject({ + value: tString + }); + scheme.ElementHandleInnerTextParams = tOptional(tObject({})); + scheme.ElementHandleInnerTextResult = tObject({ + value: tString + }); + scheme.ElementHandleInputValueParams = tOptional(tObject({})); + scheme.ElementHandleInputValueResult = tObject({ + value: tString + }); + scheme.ElementHandleIsCheckedParams = tOptional(tObject({})); + scheme.ElementHandleIsCheckedResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsDisabledParams = tOptional(tObject({})); + scheme.ElementHandleIsDisabledResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsEditableParams = tOptional(tObject({})); + scheme.ElementHandleIsEditableResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsEnabledParams = tOptional(tObject({})); + scheme.ElementHandleIsEnabledResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsHiddenParams = tOptional(tObject({})); + scheme.ElementHandleIsHiddenResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleIsVisibleParams = tOptional(tObject({})); + scheme.ElementHandleIsVisibleResult = tObject({ + value: tBoolean + }); + scheme.ElementHandleOwnerFrameParams = tOptional(tObject({})); + scheme.ElementHandleOwnerFrameResult = tObject({ + frame: tOptional(tChannel(["Frame"])) + }); + scheme.ElementHandlePressParams = tObject({ + key: tString, + delay: tOptional(tFloat), + noWaitAfter: tOptional(tBoolean) + }); + scheme.ElementHandlePressResult = tOptional(tObject({})); + scheme.ElementHandleQuerySelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean) + }); + scheme.ElementHandleQuerySelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.ElementHandleQuerySelectorAllParams = tObject({ + selector: tString + }); + scheme.ElementHandleQuerySelectorAllResult = tObject({ + elements: tArray(tChannel(["ElementHandle"])) + }); + scheme.ElementHandleScreenshotParams = tObject({ + type: tOptional(tEnum(["png", "jpeg", "webp"])), + quality: tOptional(tInt), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.ElementHandleScreenshotResult = tObject({ + binary: tBinary + }); + scheme.ElementHandleScrollIntoViewIfNeededParams = tOptional(tObject({})); + scheme.ElementHandleScrollIntoViewIfNeededResult = tOptional(tObject({})); + scheme.ElementHandleSelectOptionParams = tObject({ + elements: tOptional(tArray(tChannel(["ElementHandle"]))), + options: tOptional(tArray(tObject({ + valueOrLabel: tOptional(tString), + value: tOptional(tString), + label: tOptional(tString), + index: tOptional(tInt) + }))), + force: tOptional(tBoolean) + }); + scheme.ElementHandleSelectOptionResult = tObject({ + values: tArray(tString) + }); + scheme.ElementHandleSelectTextParams = tObject({ + force: tOptional(tBoolean) + }); + scheme.ElementHandleSelectTextResult = tOptional(tObject({})); + scheme.ElementHandleSetInputFilesParams = tObject({ + payloads: tOptional(tArray(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + }))), + localDirectory: tOptional(tString), + directoryStream: tOptional(tChannel(["WritableStream"])), + localPaths: tOptional(tArray(tString)), + streams: tOptional(tArray(tChannel(["WritableStream"]))) + }); + scheme.ElementHandleSetInputFilesResult = tOptional(tObject({})); + scheme.ElementHandleTapParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + modifiers: tOptional(tArray(tEnum(["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]))), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.ElementHandleTapResult = tOptional(tObject({})); + scheme.ElementHandleTextContentParams = tOptional(tObject({})); + scheme.ElementHandleTextContentResult = tObject({ + value: tOptional(tString) + }); + scheme.ElementHandleTypeParams = tObject({ + text: tString, + delay: tOptional(tFloat) + }); + scheme.ElementHandleTypeResult = tOptional(tObject({})); + scheme.ElementHandleUncheckParams = tObject({ + force: tOptional(tBoolean), + scroll: tOptional(tEnum(["auto", "none"])), + position: tOptional(tType("Point")), + trial: tOptional(tBoolean) + }); + scheme.ElementHandleUncheckResult = tOptional(tObject({})); + scheme.ElementHandleWaitForElementStateParams = tObject({ + state: tEnum(["visible", "hidden", "stable", "enabled", "disabled", "editable"]) + }); + scheme.ElementHandleWaitForElementStateResult = tOptional(tObject({})); + scheme.ElementHandleWaitForSelectorParams = tObject({ + selector: tString, + strict: tOptional(tBoolean), + state: tOptional(tEnum(["attached", "detached", "visible", "hidden"])) + }); + scheme.ElementHandleWaitForSelectorResult = tObject({ + element: tOptional(tChannel(["ElementHandle"])) + }); + scheme.LocalUtilsInitializer = tObject({ + deviceDescriptors: tArray(tObject({ + name: tString, + descriptor: tObject({ + userAgent: tString, + viewport: tObject({ + width: tInt, + height: tInt + }), + screen: tOptional(tObject({ + width: tInt, + height: tInt + })), + deviceScaleFactor: tFloat, + isMobile: tBoolean, + hasTouch: tBoolean, + defaultBrowserType: tEnum(["chromium", "firefox", "webkit"]) + }) + })) + }); + scheme.LocalUtilsZipParams = tObject({ + zipFile: tString, + entries: tArray(tType("NameValue")), + stacksId: tOptional(tString), + mode: tEnum(["write", "append"]), + includeSources: tBoolean, + additionalSources: tOptional(tArray(tString)) + }); + scheme.LocalUtilsZipResult = tOptional(tObject({})); + scheme.LocalUtilsHarOpenParams = tObject({ + file: tString + }); + scheme.LocalUtilsHarOpenResult = tObject({ + harId: tOptional(tString), + error: tOptional(tString) + }); + scheme.LocalUtilsHarLookupParams = tObject({ + harId: tString, + url: tString, + method: tString, + headers: tArray(tType("NameValue")), + postData: tOptional(tBinary), + isNavigationRequest: tBoolean + }); + scheme.LocalUtilsHarLookupResult = tObject({ + action: tEnum(["error", "redirect", "fulfill", "noentry"]), + message: tOptional(tString), + redirectURL: tOptional(tString), + status: tOptional(tInt), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tBinary) + }); + scheme.LocalUtilsHarCloseParams = tObject({ + harId: tString + }); + scheme.LocalUtilsHarCloseResult = tOptional(tObject({})); + scheme.LocalUtilsHarUnzipParams = tObject({ + zipFile: tString, + harFile: tString, + resourcesDir: tOptional(tString) + }); + scheme.LocalUtilsHarUnzipResult = tOptional(tObject({})); + scheme.LocalUtilsConnectParams = tObject({ + endpoint: tString, + headers: tOptional(tAny), + exposeNetwork: tOptional(tString), + slowMo: tOptional(tFloat), + socksProxyRedirectPortForTest: tOptional(tInt) + }); + scheme.LocalUtilsConnectResult = tObject({ + pipe: tChannel(["JsonPipe"]), + headers: tArray(tType("NameValue")) + }); + scheme.LocalUtilsTracingStartedParams = tObject({ + tracesDir: tOptional(tString), + traceName: tString, + live: tOptional(tBoolean) + }); + scheme.LocalUtilsTracingStartedResult = tObject({ + stacksId: tString + }); + scheme.LocalUtilsAddStackToTracingNoReplyParams = tObject({ + callData: tType("ClientSideCallMetadata") + }); + scheme.LocalUtilsAddStackToTracingNoReplyResult = tOptional(tObject({})); + scheme.LocalUtilsTraceDiscardedParams = tObject({ + stacksId: tString + }); + scheme.LocalUtilsTraceDiscardedResult = tOptional(tObject({})); + scheme.LocalUtilsGlobToRegexParams = tObject({ + glob: tString, + baseURL: tOptional(tString), + webSocketUrl: tOptional(tBoolean) + }); + scheme.LocalUtilsGlobToRegexResult = tObject({ + regex: tString + }); + scheme.SetNetworkCookie = tObject({ + name: tString, + value: tString, + url: tOptional(tString), + domain: tOptional(tString), + path: tOptional(tString), + expires: tOptional(tFloat), + httpOnly: tOptional(tBoolean), + secure: tOptional(tBoolean), + sameSite: tOptional(tEnum(["Strict", "Lax", "None"])), + partitionKey: tOptional(tString), + _crHasCrossSiteAncestor: tOptional(tBoolean) + }); + scheme.NetworkCookie = tObject({ + name: tString, + value: tString, + domain: tString, + path: tString, + expires: tFloat, + httpOnly: tBoolean, + secure: tBoolean, + sameSite: tEnum(["Strict", "Lax", "None"]), + partitionKey: tOptional(tString), + _crHasCrossSiteAncestor: tOptional(tBoolean) + }); + scheme.RequestInitializer = tObject({ + frame: tOptional(tChannel(["Frame"])), + serviceWorker: tOptional(tChannel(["Worker"])), + url: tString, + resourceType: tString, + method: tString, + postData: tOptional(tBinary), + headers: tArray(tType("NameValue")), + isNavigationRequest: tBoolean, + redirectedFrom: tOptional(tChannel(["Request"])) + }); + scheme.RequestResponseParams = tOptional(tObject({})); + scheme.RequestResponseResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.RequestRawRequestHeadersParams = tOptional(tObject({})); + scheme.RequestRawRequestHeadersResult = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.RouteInitializer = tObject({ + request: tChannel(["Request"]) + }); + scheme.RouteRedirectNavigationRequestParams = tObject({ + url: tString + }); + scheme.RouteRedirectNavigationRequestResult = tOptional(tObject({})); + scheme.RouteAbortParams = tObject({ + errorCode: tOptional(tString) + }); + scheme.RouteAbortResult = tOptional(tObject({})); + scheme.RouteContinueParams = tObject({ + url: tOptional(tString), + method: tOptional(tString), + headers: tOptional(tArray(tType("NameValue"))), + postData: tOptional(tBinary), + isFallback: tBoolean + }); + scheme.RouteContinueResult = tOptional(tObject({})); + scheme.RouteFulfillParams = tObject({ + status: tOptional(tInt), + headers: tOptional(tArray(tType("NameValue"))), + body: tOptional(tString), + isBase64: tOptional(tBoolean), + fetchResponseUid: tOptional(tString) + }); + scheme.RouteFulfillResult = tOptional(tObject({})); + scheme.WebSocketRouteInitializer = tObject({ + url: tString, + protocols: tArray(tString) + }); + scheme.WebSocketRouteMessageFromPageEvent = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteMessageFromServerEvent = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteClosePageEvent = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteCloseServerEvent = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteConnectParams = tOptional(tObject({})); + scheme.WebSocketRouteConnectResult = tOptional(tObject({})); + scheme.WebSocketRouteEnsureOpenedParams = tOptional(tObject({})); + scheme.WebSocketRouteEnsureOpenedResult = tOptional(tObject({})); + scheme.WebSocketRouteSendToPageParams = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteSendToPageResult = tOptional(tObject({})); + scheme.WebSocketRouteSendToServerParams = tObject({ + message: tString, + isBase64: tBoolean + }); + scheme.WebSocketRouteSendToServerResult = tOptional(tObject({})); + scheme.WebSocketRouteClosePageParams = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteClosePageResult = tOptional(tObject({})); + scheme.WebSocketRouteCloseServerParams = tObject({ + code: tOptional(tInt), + reason: tOptional(tString), + wasClean: tBoolean + }); + scheme.WebSocketRouteCloseServerResult = tOptional(tObject({})); + scheme.ResourceTiming = tObject({ + startTime: tFloat, + domainLookupStart: tFloat, + domainLookupEnd: tFloat, + connectStart: tFloat, + secureConnectionStart: tFloat, + connectEnd: tFloat, + requestStart: tFloat, + responseStart: tFloat + }); + scheme.ResponseInitializer = tObject({ + request: tChannel(["Request"]), + url: tString, + status: tInt, + statusText: tString, + headers: tArray(tType("NameValue")), + timing: tType("ResourceTiming"), + fromServiceWorker: tBoolean + }); + scheme.ResponseBodyParams = tOptional(tObject({})); + scheme.ResponseBodyResult = tObject({ + binary: tBinary + }); + scheme.ResponseSecurityDetailsParams = tOptional(tObject({})); + scheme.ResponseSecurityDetailsResult = tObject({ + value: tOptional(tType("SecurityDetails")) + }); + scheme.ResponseServerAddrParams = tOptional(tObject({})); + scheme.ResponseServerAddrResult = tObject({ + value: tOptional(tType("RemoteAddr")) + }); + scheme.ResponseRawResponseHeadersParams = tOptional(tObject({})); + scheme.ResponseRawResponseHeadersResult = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.ResponseHttpVersionParams = tOptional(tObject({})); + scheme.ResponseHttpVersionResult = tObject({ + value: tString + }); + scheme.ResponseSizesParams = tOptional(tObject({})); + scheme.ResponseSizesResult = tObject({ + sizes: tType("RequestSizes") + }); + scheme.SecurityDetails = tObject({ + issuer: tOptional(tString), + protocol: tOptional(tString), + subjectName: tOptional(tString), + validFrom: tOptional(tFloat), + validTo: tOptional(tFloat) + }); + scheme.RequestSizes = tObject({ + requestBodySize: tInt, + requestHeadersSize: tInt, + responseBodySize: tInt, + responseHeadersSize: tInt + }); + scheme.RemoteAddr = tObject({ + ipAddress: tString, + port: tInt + }); + scheme.WebSocketInitializer = tObject({ + url: tString + }); + scheme.WebSocketOpenEvent = tOptional(tObject({})); + scheme.WebSocketFrameSentEvent = tObject({ + opcode: tInt, + data: tString + }); + scheme.WebSocketFrameReceivedEvent = tObject({ + opcode: tInt, + data: tString + }); + scheme.WebSocketSocketErrorEvent = tObject({ + error: tString + }); + scheme.WebSocketCloseEvent = tOptional(tObject({})); + scheme.PageInitializer = tObject({ + mainFrame: tChannel(["Frame"]), + viewportSize: tOptional(tObject({ + width: tInt, + height: tInt + })), + isClosed: tBoolean, + opener: tOptional(tChannel(["Page"])), + video: tOptional(tChannel(["Artifact"])) + }); + scheme.PageBindingCallEvent = tObject({ + binding: tChannel(["BindingCall"]) + }); + scheme.PageCloseEvent = tOptional(tObject({})); + scheme.PageCrashEvent = tOptional(tObject({})); + scheme.PageDownloadEvent = tObject({ + url: tString, + suggestedFilename: tString, + artifact: tChannel(["Artifact"]) + }); + scheme.PageViewportSizeChangedEvent = tObject({ + viewportSize: tOptional(tObject({ + width: tInt, + height: tInt + })) + }); + scheme.PageFileChooserEvent = tObject({ + element: tChannel(["ElementHandle"]), + isMultiple: tBoolean + }); + scheme.PageFrameAttachedEvent = tObject({ + frame: tChannel(["Frame"]) + }); + scheme.PageFrameDetachedEvent = tObject({ + frame: tChannel(["Frame"]) + }); + scheme.PageLocatorHandlerTriggeredEvent = tObject({ + uid: tInt + }); + scheme.PageRouteEvent = tObject({ + route: tChannel(["Route"]) + }); + scheme.PageScreencastFrameEvent = tObject({ + frameId: tInt, + data: tBinary, + timestamp: tFloat, + viewportWidth: tInt, + viewportHeight: tInt + }); + scheme.PageWebSocketRouteEvent = tObject({ + webSocketRoute: tChannel(["WebSocketRoute"]) + }); + scheme.PageWebSocketEvent = tObject({ + webSocket: tChannel(["WebSocket"]) + }); + scheme.PageWorkerEvent = tObject({ + worker: tChannel(["Worker"]) + }); + scheme.PageAddInitScriptParams = tObject({ + source: tString + }); + scheme.PageAddInitScriptResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.PageCloseParams = tObject({ + reason: tOptional(tString) + }); + scheme.PageCloseResult = tOptional(tObject({})); + scheme.PageRunBeforeUnloadParams = tOptional(tObject({})); + scheme.PageRunBeforeUnloadResult = tOptional(tObject({})); + scheme.PageClearConsoleMessagesParams = tOptional(tObject({})); + scheme.PageClearConsoleMessagesResult = tOptional(tObject({})); + scheme.PageConsoleMessagesParams = tObject({ + filter: tOptional(tType("ConsoleMessagesFilter")) + }); + scheme.PageConsoleMessagesResult = tObject({ + messages: tArray(tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + })) + }); + scheme.PageEmulateMediaParams = tObject({ + media: tOptional(tEnum(["screen", "print", "no-override"])), + colorScheme: tOptional(tEnum(["dark", "light", "no-preference", "no-override"])), + reducedMotion: tOptional(tEnum(["reduce", "no-preference", "no-override"])), + forcedColors: tOptional(tEnum(["active", "none", "no-override"])), + contrast: tOptional(tEnum(["no-preference", "more", "no-override"])) + }); + scheme.PageEmulateMediaResult = tOptional(tObject({})); + scheme.PageExposeBindingParams = tObject({ + name: tString, + noGlobal: tOptional(tBoolean) + }); + scheme.PageExposeBindingResult = tObject({ + disposable: tChannel(["Disposable"]) + }); + scheme.PageGoBackParams = tObject({ + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageGoBackResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageGoForwardParams = tObject({ + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageGoForwardResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageRequestGCParams = tOptional(tObject({})); + scheme.PageRequestGCResult = tOptional(tObject({})); + scheme.PageRegisterLocatorHandlerParams = tObject({ + selector: tString, + noWaitAfter: tOptional(tBoolean) + }); + scheme.PageRegisterLocatorHandlerResult = tObject({ + uid: tInt + }); + scheme.PageResolveLocatorHandlerNoReplyParams = tObject({ + uid: tInt, + remove: tOptional(tBoolean) + }); + scheme.PageResolveLocatorHandlerNoReplyResult = tOptional(tObject({})); + scheme.PageUnregisterLocatorHandlerParams = tObject({ + uid: tInt + }); + scheme.PageUnregisterLocatorHandlerResult = tOptional(tObject({})); + scheme.PageReloadParams = tObject({ + waitUntil: tOptional(tType("LifecycleEvent")) + }); + scheme.PageReloadResult = tObject({ + response: tOptional(tChannel(["Response"])) + }); + scheme.PageExpectScreenshotParams = tObject({ + expected: tOptional(tBinary), + isNot: tBoolean, + locator: tOptional(tObject({ + frame: tChannel(["Frame"]), + selector: tString + })), + comparator: tOptional(tString), + maxDiffPixels: tOptional(tInt), + maxDiffPixelRatio: tOptional(tFloat), + threshold: tOptional(tFloat), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + type: tOptional(tEnum(["png", "webp"])), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.PageExpectScreenshotResult = tObject({ + actual: tOptional(tBinary) + }); + scheme.PageExpectScreenshotErrorDetails = tObject({ + diff: tOptional(tBinary), + customErrorMessage: tOptional(tString), + actual: tOptional(tBinary), + previous: tOptional(tBinary), + timedOut: tOptional(tBoolean), + log: tOptional(tArray(tString)) + }); + scheme.PageScreenshotParams = tObject({ + type: tOptional(tEnum(["png", "jpeg", "webp"])), + quality: tOptional(tInt), + fullPage: tOptional(tBoolean), + clip: tOptional(tType("Rect")), + omitBackground: tOptional(tBoolean), + caret: tOptional(tEnum(["hide", "initial"])), + animations: tOptional(tEnum(["disabled", "allow"])), + scale: tOptional(tEnum(["css", "device"])), + mask: tOptional(tArray(tObject({ + frame: tChannel(["Frame"]), + selector: tString + }))), + maskColor: tOptional(tString), + style: tOptional(tString) + }); + scheme.PageScreenshotResult = tObject({ + binary: tBinary + }); + scheme.PageSetExtraHTTPHeadersParams = tObject({ + headers: tArray(tType("NameValue")) + }); + scheme.PageSetExtraHTTPHeadersResult = tOptional(tObject({})); + scheme.PageSetNetworkInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.PageSetNetworkInterceptionPatternsResult = tOptional(tObject({})); + scheme.PageSetWebSocketInterceptionPatternsParams = tObject({ + patterns: tArray(tObject({ + glob: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + urlPattern: tOptional(tType("URLPattern")) + })) + }); + scheme.PageSetWebSocketInterceptionPatternsResult = tOptional(tObject({})); + scheme.PageSetViewportSizeParams = tObject({ + viewportSize: tObject({ + width: tInt, + height: tInt + }) + }); + scheme.PageSetViewportSizeResult = tOptional(tObject({})); + scheme.PageKeyboardDownParams = tObject({ + key: tString + }); + scheme.PageKeyboardDownResult = tOptional(tObject({})); + scheme.PageKeyboardUpParams = tObject({ + key: tString + }); + scheme.PageKeyboardUpResult = tOptional(tObject({})); + scheme.PageKeyboardInsertTextParams = tObject({ + text: tString + }); + scheme.PageKeyboardInsertTextResult = tOptional(tObject({})); + scheme.PageKeyboardTypeParams = tObject({ + text: tString, + delay: tOptional(tFloat) + }); + scheme.PageKeyboardTypeResult = tOptional(tObject({})); + scheme.PageKeyboardPressParams = tObject({ + key: tString, + delay: tOptional(tFloat) + }); + scheme.PageKeyboardPressResult = tOptional(tObject({})); + scheme.PageMouseMoveParams = tObject({ + x: tFloat, + y: tFloat, + steps: tOptional(tInt) + }); + scheme.PageMouseMoveResult = tOptional(tObject({})); + scheme.PageMouseDownParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseDownResult = tOptional(tObject({})); + scheme.PageMouseUpParams = tObject({ + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseUpResult = tOptional(tObject({})); + scheme.PageMouseClickParams = tObject({ + x: tFloat, + y: tFloat, + delay: tOptional(tFloat), + button: tOptional(tEnum(["left", "right", "middle"])), + clickCount: tOptional(tInt) + }); + scheme.PageMouseClickResult = tOptional(tObject({})); + scheme.PageMouseWheelParams = tObject({ + deltaX: tFloat, + deltaY: tFloat + }); + scheme.PageMouseWheelResult = tOptional(tObject({})); + scheme.PageTouchscreenTapParams = tObject({ + x: tFloat, + y: tFloat + }); + scheme.PageTouchscreenTapResult = tOptional(tObject({})); + scheme.PageClearPageErrorsParams = tOptional(tObject({})); + scheme.PageClearPageErrorsResult = tOptional(tObject({})); + scheme.PagePageErrorsParams = tObject({ + filter: tOptional(tType("ConsoleMessagesFilter")) + }); + scheme.PagePageErrorsResult = tObject({ + errors: tArray(tType("SerializedError")) + }); + scheme.PagePdfParams = tObject({ + scale: tOptional(tFloat), + displayHeaderFooter: tOptional(tBoolean), + headerTemplate: tOptional(tString), + footerTemplate: tOptional(tString), + printBackground: tOptional(tBoolean), + landscape: tOptional(tBoolean), + pageRanges: tOptional(tString), + format: tOptional(tString), + width: tOptional(tString), + height: tOptional(tString), + preferCSSPageSize: tOptional(tBoolean), + margin: tOptional(tObject({ + top: tOptional(tString), + bottom: tOptional(tString), + left: tOptional(tString), + right: tOptional(tString) + })), + tagged: tOptional(tBoolean), + outline: tOptional(tBoolean) + }); + scheme.PagePdfResult = tObject({ + pdf: tBinary + }); + scheme.PageRequestsParams = tOptional(tObject({})); + scheme.PageRequestsResult = tObject({ + requests: tArray(tChannel(["Request"])) + }); + scheme.PageStartJSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean), + reportAnonymousScripts: tOptional(tBoolean) + }); + scheme.PageStartJSCoverageResult = tOptional(tObject({})); + scheme.PageStopJSCoverageParams = tOptional(tObject({})); + scheme.PageStopJSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + scriptId: tString, + source: tOptional(tString), + functions: tArray(tObject({ + functionName: tString, + isBlockCoverage: tBoolean, + ranges: tArray(tObject({ + startOffset: tInt, + endOffset: tInt, + count: tInt + })) + })) + })) + }); + scheme.PageStartCSSCoverageParams = tObject({ + resetOnNavigation: tOptional(tBoolean) + }); + scheme.PageStartCSSCoverageResult = tOptional(tObject({})); + scheme.PageStopCSSCoverageParams = tOptional(tObject({})); + scheme.PageStopCSSCoverageResult = tObject({ + entries: tArray(tObject({ + url: tString, + text: tOptional(tString), + ranges: tArray(tObject({ + start: tInt, + end: tInt + })) + })) + }); + scheme.PageBringToFrontParams = tOptional(tObject({})); + scheme.PageBringToFrontResult = tOptional(tObject({})); + scheme.PagePickLocatorParams = tOptional(tObject({})); + scheme.PagePickLocatorResult = tObject({ + selector: tString + }); + scheme.PageCancelPickLocatorParams = tOptional(tObject({})); + scheme.PageCancelPickLocatorResult = tOptional(tObject({})); + scheme.PageHideHighlightParams = tOptional(tObject({})); + scheme.PageHideHighlightResult = tOptional(tObject({})); + scheme.PageScreencastShowOverlayParams = tObject({ + html: tString, + duration: tOptional(tFloat) + }); + scheme.PageScreencastShowOverlayResult = tObject({ + id: tString + }); + scheme.PageScreencastRemoveOverlayParams = tObject({ + id: tString + }); + scheme.PageScreencastRemoveOverlayResult = tOptional(tObject({})); + scheme.PageScreencastChapterParams = tObject({ + title: tString, + description: tOptional(tString), + duration: tOptional(tFloat) + }); + scheme.PageScreencastChapterResult = tOptional(tObject({})); + scheme.PageScreencastSetOverlayVisibleParams = tObject({ + visible: tBoolean + }); + scheme.PageScreencastSetOverlayVisibleResult = tOptional(tObject({})); + scheme.PageScreencastShowActionsParams = tObject({ + duration: tOptional(tFloat), + position: tOptional(tEnum(["top-left", "top", "top-right", "bottom-left", "bottom", "bottom-right"])), + fontSize: tOptional(tInt), + cursor: tOptional(tEnum(["none", "pointer"])) + }); + scheme.PageScreencastShowActionsResult = tOptional(tObject({})); + scheme.PageScreencastHideActionsParams = tOptional(tObject({})); + scheme.PageScreencastHideActionsResult = tOptional(tObject({})); + scheme.PageScreencastStartParams = tObject({ + size: tOptional(tObject({ + width: tInt, + height: tInt + })), + quality: tOptional(tInt), + sendFrames: tOptional(tBoolean), + record: tOptional(tBoolean) + }); + scheme.PageScreencastStartResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])) + }); + scheme.PageScreencastFrameAckParams = tObject({ + frameId: tInt + }); + scheme.PageScreencastFrameAckResult = tOptional(tObject({})); + scheme.PageScreencastStopParams = tOptional(tObject({})); + scheme.PageScreencastStopResult = tOptional(tObject({})); + scheme.PageUpdateSubscriptionParams = tObject({ + event: tEnum(["console", "dialog", "fileChooser", "request", "response", "requestFinished", "requestFailed"]), + enabled: tBoolean + }); + scheme.PageUpdateSubscriptionResult = tOptional(tObject({})); + scheme.PageSetDockTileParams = tObject({ + image: tBinary + }); + scheme.PageSetDockTileResult = tOptional(tObject({})); + scheme.PageWebStorageItemsParams = tObject({ + kind: tEnum(["local", "session"]) + }); + scheme.PageWebStorageItemsResult = tObject({ + items: tArray(tType("NameValue")) + }); + scheme.PageWebStorageGetItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString + }); + scheme.PageWebStorageGetItemResult = tObject({ + value: tOptional(tString) + }); + scheme.PageWebStorageSetItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString, + value: tString + }); + scheme.PageWebStorageSetItemResult = tOptional(tObject({})); + scheme.PageWebStorageRemoveItemParams = tObject({ + kind: tEnum(["local", "session"]), + name: tString + }); + scheme.PageWebStorageRemoveItemResult = tOptional(tObject({})); + scheme.PageWebStorageClearParams = tObject({ + kind: tEnum(["local", "session"]) + }); + scheme.PageWebStorageClearResult = tOptional(tObject({})); + scheme.RootInitializer = tOptional(tObject({})); + scheme.RootInitializeParams = tObject({ + sdkLanguage: tType("SDKLanguage") + }); + scheme.RootInitializeResult = tObject({ + playwright: tChannel(["Playwright"]) + }); + scheme.PlaywrightInitializer = tObject({ + chromium: tChannel(["BrowserType"]), + firefox: tChannel(["BrowserType"]), + webkit: tChannel(["BrowserType"]), + android: tChannel(["Android"]), + electron: tChannel(["Electron"]), + utils: tOptional(tChannel(["LocalUtils"])), + preLaunchedBrowser: tOptional(tChannel(["Browser"])), + preConnectedAndroidDevice: tOptional(tChannel(["AndroidDevice"])), + socksSupport: tOptional(tChannel(["SocksSupport"])) + }); + scheme.PlaywrightNewRequestParams = tObject({ + baseURL: tOptional(tString), + userAgent: tOptional(tString), + ignoreHTTPSErrors: tOptional(tBoolean), + extraHTTPHeaders: tOptional(tArray(tType("NameValue"))), + failOnStatusCode: tOptional(tBoolean), + clientCertificates: tOptional(tArray(tObject({ + origin: tString, + cert: tOptional(tBinary), + key: tOptional(tBinary), + passphrase: tOptional(tString), + pfx: tOptional(tBinary) + }))), + maxRedirects: tOptional(tInt), + httpCredentials: tOptional(tObject({ + username: tString, + password: tString, + origin: tOptional(tString), + send: tOptional(tEnum(["always", "unauthorized"])) + })), + proxy: tOptional(tObject({ + server: tString, + bypass: tOptional(tString), + username: tOptional(tString), + password: tOptional(tString) + })), + storageState: tOptional(tObject({ + cookies: tOptional(tArray(tType("NetworkCookie"))), + origins: tOptional(tArray(tType("SetOriginStorage"))) + })), + tracesDir: tOptional(tString) + }); + scheme.PlaywrightNewRequestResult = tObject({ + request: tChannel(["APIRequestContext"]) + }); + scheme.DebugControllerInitializer = tOptional(tObject({})); + scheme.DebugControllerInspectRequestedEvent = tObject({ + selector: tString, + locator: tString, + ariaSnapshot: tString + }); + scheme.DebugControllerSetModeRequestedEvent = tObject({ + mode: tString + }); + scheme.DebugControllerStateChangedEvent = tObject({ + pageCount: tInt + }); + scheme.DebugControllerSourceChangedEvent = tObject({ + text: tString, + header: tOptional(tString), + footer: tOptional(tString), + actions: tOptional(tArray(tString)) + }); + scheme.DebugControllerPausedEvent = tObject({ + paused: tBoolean + }); + scheme.DebugControllerInitializeParams = tObject({ + codegenId: tString, + sdkLanguage: tType("SDKLanguage") + }); + scheme.DebugControllerInitializeResult = tOptional(tObject({})); + scheme.DebugControllerSetReportStateChangedParams = tObject({ + enabled: tBoolean + }); + scheme.DebugControllerSetReportStateChangedResult = tOptional(tObject({})); + scheme.DebugControllerSetRecorderModeParams = tObject({ + mode: tEnum(["inspecting", "recording", "none"]), + testIdAttributeName: tOptional(tString), + generateAutoExpect: tOptional(tBoolean) + }); + scheme.DebugControllerSetRecorderModeResult = tOptional(tObject({})); + scheme.DebugControllerHighlightParams = tObject({ + selector: tOptional(tString), + ariaTemplate: tOptional(tString) + }); + scheme.DebugControllerHighlightResult = tOptional(tObject({})); + scheme.DebugControllerHideHighlightParams = tOptional(tObject({})); + scheme.DebugControllerHideHighlightResult = tOptional(tObject({})); + scheme.DebugControllerResumeParams = tOptional(tObject({})); + scheme.DebugControllerResumeResult = tOptional(tObject({})); + scheme.DebugControllerKillParams = tOptional(tObject({})); + scheme.DebugControllerKillResult = tOptional(tObject({})); + scheme.SocksSupportInitializer = tOptional(tObject({})); + scheme.SocksSupportSocksRequestedEvent = tObject({ + uid: tString, + host: tString, + port: tInt + }); + scheme.SocksSupportSocksDataEvent = tObject({ + uid: tString, + data: tBinary + }); + scheme.SocksSupportSocksClosedEvent = tObject({ + uid: tString + }); + scheme.SocksSupportSocksConnectedParams = tObject({ + uid: tString, + host: tString, + port: tInt + }); + scheme.SocksSupportSocksConnectedResult = tOptional(tObject({})); + scheme.SocksSupportSocksFailedParams = tObject({ + uid: tString, + errorCode: tString + }); + scheme.SocksSupportSocksFailedResult = tOptional(tObject({})); + scheme.SocksSupportSocksDataParams = tObject({ + uid: tString, + data: tBinary + }); + scheme.SocksSupportSocksDataResult = tOptional(tObject({})); + scheme.SocksSupportSocksErrorParams = tObject({ + uid: tString, + error: tString + }); + scheme.SocksSupportSocksErrorResult = tOptional(tObject({})); + scheme.SocksSupportSocksEndParams = tObject({ + uid: tString + }); + scheme.SocksSupportSocksEndResult = tOptional(tObject({})); + scheme.JsonPipeInitializer = tOptional(tObject({})); + scheme.JsonPipeMessageEvent = tObject({ + message: tAny + }); + scheme.JsonPipeClosedEvent = tObject({ + reason: tOptional(tString) + }); + scheme.JsonPipeSendParams = tObject({ + message: tAny + }); + scheme.JsonPipeSendResult = tOptional(tObject({})); + scheme.JsonPipeCloseParams = tOptional(tObject({})); + scheme.JsonPipeCloseResult = tOptional(tObject({})); + scheme.ExpectedTextValue = tObject({ + string: tOptional(tString), + regexSource: tOptional(tString), + regexFlags: tOptional(tString), + matchSubstring: tOptional(tBoolean), + ignoreCase: tOptional(tBoolean), + normalizeWhiteSpace: tOptional(tBoolean) + }); + scheme.SelectorEngine = tObject({ + name: tString, + source: tString, + contentScript: tOptional(tBoolean) + }); + scheme.FormField = tObject({ + name: tString, + value: tOptional(tString), + file: tOptional(tObject({ + name: tString, + mimeType: tOptional(tString), + buffer: tBinary + })) + }); + scheme.LifecycleEvent = tEnum(["load", "domcontentloaded", "networkidle", "commit"]); + scheme.ConsoleMessagesFilter = tEnum(["all", "since-navigation"]); + scheme.RecorderSource = tObject({ + isRecorded: tBoolean, + id: tString, + label: tString, + text: tString, + language: tString, + highlight: tArray(tObject({ + line: tInt, + type: tString + })), + revealLine: tOptional(tInt), + group: tOptional(tString) + }); + scheme.IndexedDBDatabase = tObject({ + name: tString, + version: tInt, + stores: tArray(tObject({ + name: tString, + autoIncrement: tBoolean, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + records: tArray(tObject({ + key: tOptional(tAny), + keyEncoded: tOptional(tAny), + value: tOptional(tAny), + valueEncoded: tOptional(tAny) + })), + indexes: tArray(tObject({ + name: tString, + keyPath: tOptional(tString), + keyPathArray: tOptional(tArray(tString)), + multiEntry: tBoolean, + unique: tBoolean + })) + })) + }); + scheme.SetOriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) + }); + scheme.OriginStorage = tObject({ + origin: tString, + localStorage: tArray(tType("NameValue")), + indexedDB: tOptional(tArray(tType("IndexedDBDatabase"))) + }); + scheme.RecordHarOptions = tObject({ + content: tOptional(tEnum(["embed", "attach", "omit"])), + mode: tOptional(tEnum(["full", "minimal"])), + urlGlob: tOptional(tString), + urlRegexSource: tOptional(tString), + urlRegexFlags: tOptional(tString), + harPath: tOptional(tString), + resourcesDir: tOptional(tString) + }); + scheme.CDPSessionInitializer = tOptional(tObject({})); + scheme.CDPSessionEventEvent = tObject({ + method: tString, + params: tOptional(tAny) + }); + scheme.CDPSessionCloseEvent = tOptional(tObject({})); + scheme.CDPSessionSendParams = tObject({ + method: tString, + params: tOptional(tAny) + }); + scheme.CDPSessionSendResult = tObject({ + result: tAny + }); + scheme.CDPSessionDetachParams = tOptional(tObject({})); + scheme.CDPSessionDetachResult = tOptional(tObject({})); + scheme.BindingCallInitializer = tObject({ + frame: tChannel(["Frame"]), + name: tString, + args: tArray(tType("SerializedValue")) + }); + scheme.BindingCallRejectParams = tObject({ + error: tType("SerializedError") + }); + scheme.BindingCallRejectResult = tOptional(tObject({})); + scheme.BindingCallResolveParams = tObject({ + result: tType("SerializedArgument") + }); + scheme.BindingCallResolveResult = tOptional(tObject({})); + scheme.DebuggerInitializer = tOptional(tObject({})); + scheme.DebuggerPausedStateChangedEvent = tObject({ + pausedDetails: tOptional(tObject({ + location: tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + }), + title: tString, + stack: tOptional(tString) + })) + }); + scheme.DebuggerRequestPauseParams = tOptional(tObject({})); + scheme.DebuggerRequestPauseResult = tOptional(tObject({})); + scheme.DebuggerResumeParams = tOptional(tObject({})); + scheme.DebuggerResumeResult = tOptional(tObject({})); + scheme.DebuggerNextParams = tOptional(tObject({})); + scheme.DebuggerNextResult = tOptional(tObject({})); + scheme.DebuggerRunToParams = tObject({ + location: tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + }) + }); + scheme.DebuggerRunToResult = tOptional(tObject({})); + scheme.DialogInitializer = tObject({ + page: tOptional(tChannel(["Page"])), + type: tString, + message: tString, + defaultValue: tString + }); + scheme.DialogAcceptParams = tObject({ + promptText: tOptional(tString) + }); + scheme.DialogAcceptResult = tOptional(tObject({})); + scheme.DialogDismissParams = tOptional(tObject({})); + scheme.DialogDismissResult = tOptional(tObject({})); + scheme.SerializedValue = tObject({ + n: tOptional(tFloat), + b: tOptional(tBoolean), + s: tOptional(tString), + v: tOptional(tEnum(["null", "undefined", "NaN", "Infinity", "-Infinity", "-0"])), + d: tOptional(tString), + u: tOptional(tString), + bi: tOptional(tString), + ta: tOptional(tObject({ + b: tBinary, + k: tEnum(["i8", "ui8", "ui8c", "i16", "ui16", "i32", "ui32", "f32", "f64", "bi64", "bui64"]) + })), + e: tOptional(tObject({ + m: tString, + n: tString, + s: tString + })), + r: tOptional(tObject({ + p: tString, + f: tString + })), + a: tOptional(tArray(tType("SerializedValue"))), + o: tOptional(tArray(tObject({ + k: tString, + v: tType("SerializedValue") + }))), + h: tOptional(tInt), + fn: tOptional(tString), + id: tOptional(tInt), + ref: tOptional(tInt) + }); + scheme.SerializedArgument = tObject({ + value: tType("SerializedValue"), + handles: tArray(tChannel("*")) + }); + scheme.SerializedError = tObject({ + error: tOptional(tObject({ + message: tString, + name: tString, + stack: tOptional(tString) + })), + value: tOptional(tType("SerializedValue")) + }); + scheme.StackFrame = tObject({ + file: tString, + line: tInt, + column: tInt, + function: tOptional(tString) + }); + scheme.VirtualCredential = tObject({ + id: tString, + rpId: tString, + userHandle: tString, + privateKey: tString, + publicKey: tString + }); + scheme.Point = tObject({ + x: tFloat, + y: tFloat + }); + scheme.Rect = tObject({ + x: tFloat, + y: tFloat, + width: tFloat, + height: tFloat + }); + scheme.URLPattern = tObject({ + hash: tString, + hostname: tString, + password: tString, + pathname: tString, + port: tString, + protocol: tString, + search: tString, + username: tString + }); + scheme.NameValue = tObject({ + name: tString, + value: tString + }); + scheme.TracingInitializer = tOptional(tObject({})); + scheme.TracingTracingStartParams = tObject({ + name: tOptional(tString), + snapshots: tOptional(tBoolean), + screenshots: tOptional(tBoolean), + live: tOptional(tBoolean) + }); + scheme.TracingTracingStartResult = tOptional(tObject({})); + scheme.TracingTracingStartChunkParams = tObject({ + name: tOptional(tString), + title: tOptional(tString) + }); + scheme.TracingTracingStartChunkResult = tObject({ + traceName: tString + }); + scheme.TracingTracingGroupParams = tObject({ + name: tString, + location: tOptional(tObject({ + file: tString, + line: tOptional(tInt), + column: tOptional(tInt) + })) + }); + scheme.TracingTracingGroupResult = tOptional(tObject({})); + scheme.TracingTracingGroupEndParams = tOptional(tObject({})); + scheme.TracingTracingGroupEndResult = tOptional(tObject({})); + scheme.TracingTracingStopChunkParams = tObject({ + mode: tEnum(["archive", "discard", "entries"]) + }); + scheme.TracingTracingStopChunkResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])), + entries: tOptional(tArray(tType("NameValue"))) + }); + scheme.TracingTracingStopParams = tOptional(tObject({})); + scheme.TracingTracingStopResult = tOptional(tObject({})); + scheme.TracingHarStartParams = tObject({ + page: tOptional(tChannel(["Page"])), + options: tType("RecordHarOptions") + }); + scheme.TracingHarStartResult = tObject({ + harId: tString + }); + scheme.TracingHarExportParams = tObject({ + harId: tOptional(tString), + mode: tEnum(["archive", "entries"]) + }); + scheme.TracingHarExportResult = tObject({ + artifact: tOptional(tChannel(["Artifact"])), + entries: tOptional(tArray(tType("NameValue"))) + }); + scheme.WorkerInitializer = tObject({ + url: tString + }); + scheme.WorkerConsoleEvent = tObject({ + type: tString, + text: tString, + args: tArray(tChannel(["ElementHandle", "JSHandle"])), + location: tObject({ + url: tString, + lineNumber: tInt, + columnNumber: tInt + }), + timestamp: tFloat + }); + scheme.WorkerCloseEvent = tOptional(tObject({})); + scheme.WorkerDisconnectParams = tObject({ + reason: tOptional(tString) + }); + scheme.WorkerDisconnectResult = tOptional(tObject({})); + scheme.WorkerEvaluateExpressionParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.WorkerEvaluateExpressionResult = tObject({ + value: tType("SerializedValue") + }); + scheme.WorkerEvaluateExpressionHandleParams = tObject({ + expression: tString, + isFunction: tOptional(tBoolean), + arg: tType("SerializedArgument") + }); + scheme.WorkerEvaluateExpressionHandleResult = tObject({ + handle: tChannel(["ElementHandle", "JSHandle"]) + }); + scheme.WorkerUpdateSubscriptionParams = tObject({ + event: tEnum(["console"]), + enabled: tBoolean + }); + scheme.WorkerUpdateSubscriptionResult = tOptional(tObject({})); + } +}); + +// packages/playwright-core/src/server/callLog.ts +function compressCallLog(log2) { + const lines = []; + for (const block of findRepeatedSubsequences(log2)) { + for (let i = 0; i < block.sequence.length; i++) { + const line = block.sequence[i]; + const leadingWhitespace = line.match(/^\s*/); + const whitespacePrefix = " " + leadingWhitespace?.[0] || ""; + const countPrefix = `${block.count} \xD7 `; + if (block.count > 1 && i === 0) + lines.push(whitespacePrefix + countPrefix + line.trim()); + else if (block.count > 1) + lines.push(whitespacePrefix + " ".repeat(countPrefix.length - 2) + "- " + line.trim()); + else + lines.push(whitespacePrefix + "- " + line.trim()); + } + } + return lines; +} +function findRepeatedSubsequences(s) { + const n = s.length; + const result2 = []; + let i = 0; + const arraysEqual = (a1, a2) => { + if (a1.length !== a2.length) + return false; + for (let j = 0; j < a1.length; j++) { + if (a1[j] !== a2[j]) + return false; + } + return true; + }; + while (i < n) { + let maxRepeatCount = 1; + let maxRepeatSubstr = [s[i]]; + let maxRepeatLength = 1; + for (let p = 1; p <= n - i; p++) { + const substr = s.slice(i, i + p); + let k = 1; + while (i + p * k <= n && arraysEqual(s.slice(i + p * (k - 1), i + p * k), substr)) + k += 1; + k -= 1; + if (k > 1 && k * p > maxRepeatCount * maxRepeatLength) { + maxRepeatCount = k; + maxRepeatSubstr = substr; + maxRepeatLength = p; + } + } + result2.push({ sequence: maxRepeatSubstr, count: maxRepeatCount }); + i += maxRepeatLength * maxRepeatCount; + } + return result2; +} +var findRepeatedSubsequencesForTest; +var init_callLog = __esm({ + "packages/playwright-core/src/server/callLog.ts"() { + "use strict"; + findRepeatedSubsequencesForTest = findRepeatedSubsequences; + } +}); + +// packages/playwright-core/src/server/dispatchers/dispatcher.ts +function setMaxDispatchersForTest(value2) { + maxDispatchersOverride = value2; +} +function maxDispatchersForBucket(gcBucket) { + return maxDispatchersOverride ?? { + "JSHandle": 1e5, + "ElementHandle": 1e5 + }[gcBucket] ?? 1e4; +} +var import_events5, metadataValidator, waitInfoValidator, maxDispatchersOverride, Dispatcher, RootDispatcher, DispatcherConnection; +var init_dispatcher = __esm({ + "packages/playwright-core/src/server/dispatchers/dispatcher.ts"() { + "use strict"; + import_events5 = require("events"); + init_protocolMetainfo(); + init_eventsHelper(); + init_debug(); + init_assert(); + init_time(); + init_stackTrace(); + init_validator(); + init_errors(); + init_instrumentation(); + init_protocolError(); + init_callLog(); + init_progress(); + metadataValidator = createMetadataValidator(); + waitInfoValidator = createWaitInfoValidator(); + Dispatcher = class extends import_events5.EventEmitter { + constructor(parent, object, type3, initializer, gcBucket) { + super(); + this._dispatchers = /* @__PURE__ */ new Map(); + this._disposed = false; + this._eventListeners = []; + this.connection = parent instanceof DispatcherConnection ? parent : parent.connection; + this._parent = parent instanceof DispatcherConnection ? void 0 : parent; + const guid = object.guid; + this._guid = guid; + this._type = type3; + this._object = object; + this._gcBucket = gcBucket ?? type3; + this.connection.registerDispatcher(this); + if (this._parent) { + assert(!this._parent._dispatchers.has(guid)); + this._parent._dispatchers.set(guid, this); + } + if (this._parent) + this.connection.sendCreate(this._parent, type3, guid, initializer); + this.connection.maybeDisposeStaleDispatchers(this._gcBucket); + } + parentScope() { + return this._parent; + } + addObjectListener(eventName, handler) { + this._eventListeners.push(eventsHelper.addEventListener(this._object, eventName, handler)); + } + adopt(child) { + if (child._parent === this) + return; + const oldParent = child._parent; + oldParent._dispatchers.delete(child._guid); + this._dispatchers.set(child._guid, child); + child._parent = this; + this.connection.sendAdopt(this, child); + } + createProgressController(callMetadata) { + return ProgressController.createForSdkObject(this._object, callMetadata); + } + _dispatchEvent(method, params2) { + if (this._disposed) { + if (isUnderTest()) + throw new Error(`${this._guid} is sending "${String(method)}" event after being disposed`); + return; + } + this.connection.sendEvent(this, method, params2); + } + _dispose(reason) { + this._disposeRecursively(new TargetClosedError(this._object.closeReason())); + this.connection.sendDispose(this, reason); + } + _onDispose() { + } + async stopPendingOperations(error) { + const guids = /* @__PURE__ */ new Set(); + const collect = (dispatcher) => { + guids.add(dispatcher._guid); + for (const child of [...dispatcher._dispatchers.values()]) + collect(child); + }; + collect(this); + await this.connection.abortControllersForGuids(guids, error); + } + _disposeRecursively(error) { + assert(!this._disposed, `${this._guid} is disposed more than once`); + this._onDispose(); + this._disposed = true; + eventsHelper.removeEventListeners(this._eventListeners); + this._parent?._dispatchers.delete(this._guid); + const list = this.connection._dispatchersByBucket.get(this._gcBucket); + list?.delete(this._guid); + this.connection._dispatcherByGuid.delete(this._guid); + this.connection._dispatcherByObject.delete(this._object); + for (const dispatcher of [...this._dispatchers.values()]) + dispatcher._disposeRecursively(error); + this._dispatchers.clear(); + } + _debugScopeState() { + return { + _guid: this._guid, + objects: Array.from(this._dispatchers.values()).map((o) => o._debugScopeState()) + }; + } + }; + RootDispatcher = class extends Dispatcher { + constructor(connection, createPlaywright2) { + super(connection, createRootSdkObject(), "Root", {}); + this.createPlaywright = createPlaywright2; + this._initialized = false; + } + async initialize(params2, progress2) { + assert(this.createPlaywright); + assert(!this._initialized); + this._initialized = true; + return { + playwright: await progress2.race(this.createPlaywright(this, params2)) + }; + } + }; + DispatcherConnection = class { + constructor(isInProcess) { + this._dispatcherByGuid = /* @__PURE__ */ new Map(); + this._dispatcherByObject = /* @__PURE__ */ new Map(); + this._dispatchersByBucket = /* @__PURE__ */ new Map(); + this.onmessage = (message) => { + }; + this._waitOperations = /* @__PURE__ */ new Map(); + this._activeProgressControllers = /* @__PURE__ */ new Map(); + this._isInProcess = !!isInProcess; + } + async abortControllersForGuids(guids, error) { + const controllers = []; + for (const controller of this._activeProgressControllers.values()) { + if (controller.metadata.objectId && guids.has(controller.metadata.objectId)) + controllers.push(controller); + } + await Promise.all(controllers.map((controller) => controller.abort(error))); + } + sendEvent(dispatcher, event, params2) { + const validator = findValidator(dispatcher._type, event, "Event"); + params2 = validator(params2, "", this._validatorToWireContext()); + this.onmessage({ guid: dispatcher._guid, method: event, params: params2 }); + } + sendCreate(parent, type3, guid, initializer) { + const validator = findValidator(type3, "", "Initializer"); + initializer = validator(initializer, "", this._validatorToWireContext()); + this.onmessage({ guid: parent._guid, method: "__create__", params: { type: type3, initializer, guid } }); + } + sendAdopt(parent, dispatcher) { + this.onmessage({ guid: parent._guid, method: "__adopt__", params: { guid: dispatcher._guid } }); + } + sendDispose(dispatcher, reason) { + this.onmessage({ guid: dispatcher._guid, method: "__dispose__", params: { reason } }); + } + _validatorToWireContext() { + return { + tChannelImpl: this._tChannelImplToWire.bind(this), + binary: this._isInProcess ? "buffer" : "toBase64", + isUnderTest + }; + } + _validatorFromWireContext() { + return { + tChannelImpl: this._tChannelImplFromWire.bind(this), + binary: this._isInProcess ? "buffer" : "fromBase64", + isUnderTest + }; + } + _tChannelImplFromWire(names, arg, path66, context2) { + if (arg && typeof arg === "object" && typeof arg.guid === "string") { + const guid = arg.guid; + const dispatcher = this._dispatcherByGuid.get(guid); + if (!dispatcher) + throw new ValidationError(`${path66}: no object with guid ${guid}`); + if (names !== "*" && !names.includes(dispatcher._type)) + throw new ValidationError(`${path66}: object with guid ${guid} has type ${dispatcher._type}, expected ${names.toString()}`); + return dispatcher; + } + throw new ValidationError(`${path66}: expected guid for ${names.toString()}`); + } + _tChannelImplToWire(names, arg, path66, context2) { + if (arg instanceof Dispatcher) { + if (names !== "*" && !names.includes(arg._type)) + throw new ValidationError(`${path66}: dispatcher with guid ${arg._guid} has type ${arg._type}, expected ${names.toString()}`); + return { guid: arg._guid }; + } + throw new ValidationError(`${path66}: expected dispatcher ${names.toString()}`); + } + existingDispatcher(object) { + return this._dispatcherByObject.get(object); + } + registerDispatcher(dispatcher) { + assert(!this._dispatcherByGuid.has(dispatcher._guid)); + this._dispatcherByGuid.set(dispatcher._guid, dispatcher); + this._dispatcherByObject.set(dispatcher._object, dispatcher); + let list = this._dispatchersByBucket.get(dispatcher._gcBucket); + if (!list) { + list = /* @__PURE__ */ new Set(); + this._dispatchersByBucket.set(dispatcher._gcBucket, list); + } + list.add(dispatcher._guid); + } + maybeDisposeStaleDispatchers(gcBucket) { + const maxDispatchers = maxDispatchersForBucket(gcBucket); + const list = this._dispatchersByBucket.get(gcBucket); + if (!list || list.size <= maxDispatchers) + return; + const dispatchersArray = [...list]; + const disposeCount = maxDispatchers / 10 | 0; + this._dispatchersByBucket.set(gcBucket, new Set(dispatchersArray.slice(disposeCount))); + for (let i = 0; i < disposeCount; ++i) { + const d = this._dispatcherByGuid.get(dispatchersArray[i]); + if (!d) + continue; + d._dispose("gc"); + } + } + async dispatch(message) { + const { id, guid, method, params: params2, metadata } = message; + const dispatcher = this._dispatcherByGuid.get(guid); + if (method === "__waitInfo__") { + if (dispatcher) + await this._dispatchWaitInfo(id, dispatcher, params2, metadata); + return; + } + if (method === "__abort__") { + await this._activeProgressControllers.get(`call@${params2.id}`)?.abort(new AbortError(params2.reason)); + return; + } + if (!dispatcher) { + this.onmessage({ id, error: serializeError(new TargetClosedError(void 0)) }); + return; + } + let validParams; + let validMetadata; + try { + const validator = findValidator(dispatcher._type, method, "Params"); + const validatorContext = this._validatorFromWireContext(); + validParams = validator(params2, "", validatorContext); + validMetadata = metadataValidator(metadata, "", validatorContext); + if (typeof dispatcher[method] !== "function") + throw new Error(`Mismatching dispatcher: "${dispatcher._type}" does not implement "${method}"`); + } catch (e) { + this.onmessage({ id, error: serializeError(e) }); + return; + } + const metainfo = getMetainfo({ type: dispatcher._type, method }); + if (metainfo?.internal) { + validMetadata.internal = true; + } + const sdkObject = dispatcher._object; + const callMetadata = { + id: `call@${id}`, + location: validMetadata.location, + title: validMetadata.title, + internal: validMetadata.internal, + stepId: validMetadata.stepId, + objectId: sdkObject.guid, + pageId: sdkObject.attribution?.page?.guid, + frameId: sdkObject.attribution?.frame?.guid, + startTime: monotonicTime(), + endTime: 0, + type: dispatcher._type, + method, + params: params2 || {}, + timeout: validMetadata.timeout, + log: [] + }; + const controller = dispatcher.createProgressController(callMetadata); + this._activeProgressControllers.set(callMetadata.id, controller); + await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata); + const response2 = { id }; + try { + if (this._dispatcherByGuid.get(guid) !== dispatcher) + throw new TargetClosedError(sdkObject.closeReason()); + const result2 = await controller.run((progress2) => dispatcher[method](validParams, progress2), validMetadata.timeout); + const validator = findValidator(dispatcher._type, method, "Result"); + response2.result = validator(result2, "", this._validatorToWireContext()); + callMetadata.result = result2; + } catch (e) { + if (isTargetClosedError(e)) { + const reason = sdkObject.closeReason(); + if (reason) + rewriteErrorMessage(e, reason); + } else if (isProtocolError(e)) { + if (e.type === "closed") + e = new TargetClosedError(sdkObject.closeReason(), e.browserLogMessage()); + else if (e.type === "crashed") + rewriteErrorMessage(e, "Target crashed " + e.browserLogMessage()); + } + response2.error = serializeError(e); + const detailsValidator = maybeFindValidator(dispatcher._type, method, "ErrorDetails"); + if (detailsValidator) + response2.errorDetails = detailsValidator(e?.details ?? {}, "", this._validatorToWireContext()); + callMetadata.error = response2.error; + } finally { + callMetadata.endTime = monotonicTime(); + await sdkObject.instrumentation.onAfterCall(sdkObject, callMetadata); + if (metainfo?.slowMo) + await this._doSlowMo(sdkObject); + this._activeProgressControllers.delete(callMetadata.id); + } + if (response2.error) + response2.log = compressCallLog(callMetadata.log); + this.onmessage(response2); + } + async _doSlowMo(sdkObject) { + const slowMo = sdkObject.attribution.browser?.options.slowMo; + if (slowMo) + await new Promise((f) => setTimeout(f, slowMo)); + } + async _dispatchWaitInfo(id, dispatcher, params2, metadata) { + let info; + let validMetadata; + try { + const validatorContext = this._validatorFromWireContext(); + info = waitInfoValidator(params2, "", validatorContext); + validMetadata = metadataValidator(metadata, "", validatorContext); + } catch { + return; + } + const sdkObject = dispatcher._object; + if (info.phase === "before") { + const callMetadata = { + id: `call@${id}`, + location: validMetadata.location, + title: validMetadata.title, + internal: validMetadata.internal, + stepId: validMetadata.stepId, + objectId: sdkObject.guid, + pageId: sdkObject.attribution?.page?.guid, + frameId: sdkObject.attribution?.frame?.guid, + startTime: monotonicTime(), + endTime: 0, + type: dispatcher._type, + method: "__waitInfo__", + params: params2 || {}, + log: [] + }; + this._waitOperations.set(info.waitId, callMetadata); + await sdkObject.instrumentation.onBeforeCall(sdkObject, callMetadata).catch(() => { + }); + return; + } + const originalMetadata = this._waitOperations.get(info.waitId); + if (!originalMetadata) + return; + if (info.phase === "log" && info.message) { + originalMetadata.log.push(info.message); + sdkObject.instrumentation.onCallLog(sdkObject, originalMetadata, "api", info.message); + return; + } + if (info.phase === "after") { + originalMetadata.endTime = monotonicTime(); + originalMetadata.error = info.error ? { error: { name: "Error", message: info.error } } : void 0; + this._waitOperations.delete(info.waitId); + await sdkObject.instrumentation.onAfterCall(sdkObject, originalMetadata).catch(() => { + }); + } + } + }; + } +}); + +// packages/isomorphic/utilityScriptSerializers.ts +function isRegExp5(obj) { + try { + return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]"; + } catch (error) { + return false; + } +} +function isDate2(obj) { + try { + return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]"; + } catch (error) { + return false; + } +} +function isURL2(obj) { + try { + return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]"; + } catch (error) { + return false; + } +} +function isError3(obj) { + try { + return obj instanceof Error || obj && Object.getPrototypeOf(obj)?.name === "Error"; + } catch (error) { + return false; + } +} +function isTypedArray(obj, constructor) { + try { + return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`; + } catch (error) { + return false; + } +} +function isArrayBuffer(obj) { + try { + return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]"; + } catch (error) { + return false; + } +} +function typedArrayToBase64(array) { + if ("toBase64" in array) + return array.toBase64(); + const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join(""); + return btoa(binary); +} +function base64ToTypedArray(base64, TypedArrayConstructor) { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) + bytes[i] = binary.charCodeAt(i); + return new TypedArrayConstructor(bytes.buffer); +} +function parseEvaluationResultValue(value2, handles = [], refs = /* @__PURE__ */ new Map()) { + if (Object.is(value2, void 0)) + return void 0; + if (typeof value2 === "object" && value2) { + if ("ref" in value2) + return refs.get(value2.ref); + if ("v" in value2) { + if (value2.v === "undefined") + return void 0; + if (value2.v === "null") + return null; + if (value2.v === "NaN") + return NaN; + if (value2.v === "Infinity") + return Infinity; + if (value2.v === "-Infinity") + return -Infinity; + if (value2.v === "-0") + return -0; + return void 0; + } + if ("d" in value2) { + return new Date(value2.d); + } + if ("u" in value2) + return new URL(value2.u); + if ("bi" in value2) + return BigInt(value2.bi); + if ("e" in value2) { + const error = new Error(value2.e.m); + error.name = value2.e.n; + error.stack = value2.e.s; + return error; + } + if ("r" in value2) + return new RegExp(value2.r.p, value2.r.f); + if ("a" in value2) { + const result2 = []; + refs.set(value2.id, result2); + for (const a of value2.a) + result2.push(parseEvaluationResultValue(a, handles, refs)); + return result2; + } + if ("o" in value2) { + const result2 = {}; + refs.set(value2.id, result2); + for (const { k, v } of value2.o) { + if (k === "__proto__") + continue; + result2[k] = parseEvaluationResultValue(v, handles, refs); + } + return result2; + } + if ("h" in value2) + return handles[value2.h]; + if ("fn" in value2) { + const name = value2.fn; + return (...args) => globalThis[kBindingsControllerProperty].callBinding(name, ...args); + } + if ("ta" in value2) + return base64ToTypedArray(value2.ta.b, typedArrayConstructors[value2.ta.k]); + if ("ab" in value2) + return base64ToTypedArray(value2.ab.b, Uint8Array).buffer; + } + return value2; +} +function serializeAsCallArgument(value2, handleSerializer) { + return serialize(value2, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 }); +} +function serialize(value2, handleSerializer, visitorInfo) { + if (value2 && typeof value2 === "object") { + if (typeof globalThis.Window === "function" && value2 instanceof globalThis.Window) + return "ref: "; + if (typeof globalThis.Document === "function" && value2 instanceof globalThis.Document) + return "ref: "; + if (typeof globalThis.Node === "function" && value2 instanceof globalThis.Node) + return "ref: "; + } + return innerSerialize(value2, handleSerializer, visitorInfo); +} +function innerSerialize(value2, handleSerializer, visitorInfo) { + const result2 = handleSerializer(value2); + if ("fallThrough" in result2) + value2 = result2.fallThrough; + else + return result2; + if (typeof value2 === "symbol") + return { v: "undefined" }; + if (Object.is(value2, void 0)) + return { v: "undefined" }; + if (Object.is(value2, null)) + return { v: "null" }; + if (Object.is(value2, NaN)) + return { v: "NaN" }; + if (Object.is(value2, Infinity)) + return { v: "Infinity" }; + if (Object.is(value2, -Infinity)) + return { v: "-Infinity" }; + if (Object.is(value2, -0)) + return { v: "-0" }; + if (typeof value2 === "boolean") + return value2; + if (typeof value2 === "number") + return value2; + if (typeof value2 === "string") + return value2; + if (typeof value2 === "bigint") + return { bi: value2.toString() }; + if (isError3(value2)) { + let stack; + if (value2.stack?.startsWith(value2.name + ": " + value2.message)) { + stack = value2.stack; + } else { + stack = `${value2.name}: ${value2.message} +${value2.stack}`; + } + return { e: { n: value2.name, m: value2.message, s: stack } }; + } + if (isDate2(value2)) + return { d: value2.toJSON() }; + if (isURL2(value2)) + return { u: value2.toJSON() }; + if (isRegExp5(value2)) + return { r: { p: value2.source, f: value2.flags } }; + for (const [k, ctor] of Object.entries(typedArrayConstructors)) { + if (isTypedArray(value2, ctor)) + return { ta: { b: typedArrayToBase64(value2), k } }; + } + if (isArrayBuffer(value2)) + return { ab: { b: typedArrayToBase64(new Uint8Array(value2)) } }; + const id = visitorInfo.visited.get(value2); + if (id) + return { ref: id }; + if (Array.isArray(value2)) { + const a = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (let i = 0; i < value2.length; ++i) + a.push(serialize(value2[i], handleSerializer, visitorInfo)); + return { a, id: id2 }; + } + if (typeof value2 === "object") { + const o = []; + const id2 = ++visitorInfo.lastId; + visitorInfo.visited.set(value2, id2); + for (const name of Object.keys(value2)) { + let item; + try { + item = value2[name]; + } catch (e) { + continue; + } + if (name === "toJSON" && typeof item === "function") + o.push({ k: name, v: { o: [], id: 0 } }); + else + o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) }); + } + let jsonWrapper; + try { + if (o.length === 0 && value2.toJSON && typeof value2.toJSON === "function") + jsonWrapper = { value: value2.toJSON() }; + } catch (e) { + } + if (jsonWrapper) + return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo); + return { o, id: id2 }; + } + if (typeof value2 === "function" && value2.name.startsWith(kFunctionBindingPrefix)) + return { fn: value2.name }; +} +var kFunctionBindingPrefix, kBindingsControllerProperty, typedArrayConstructors; +var init_utilityScriptSerializers = __esm({ + "packages/isomorphic/utilityScriptSerializers.ts"() { + "use strict"; + kFunctionBindingPrefix = "__pw_fn_"; + kBindingsControllerProperty = "__playwright__binding__controller__"; + typedArrayConstructors = { + i8: Int8Array, + ui8: Uint8Array, + ui8c: Uint8ClampedArray, + i16: Int16Array, + ui16: Uint16Array, + i32: Int32Array, + ui32: Uint32Array, + // TODO: add Float16Array once it's in baseline + f32: Float32Array, + f64: Float64Array, + bi64: BigInt64Array, + bui64: BigUint64Array + }; + } +}); + +// packages/playwright-core/src/generated/utilityScriptSource.ts +var source3; +var init_utilityScriptSource = __esm({ + "packages/playwright-core/src/generated/utilityScriptSource.ts"() { + "use strict"; + source3 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/utilityScript.ts\nvar utilityScript_exports = {};\n__export(utilityScript_exports, {\n UtilityScript: () => UtilityScript\n});\nmodule.exports = __toCommonJS(utilityScript_exports);\n\n// packages/isomorphic/utilityScriptSerializers.ts\nvar kFunctionBindingPrefix = "__pw_fn_";\nvar kBindingsControllerProperty = "__playwright__binding__controller__";\nfunction isRegExp(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nfunction isArrayBuffer(obj) {\n try {\n return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]";\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("fn" in value) {\n const name = value.fn;\n return (...args) => globalThis[kBindingsControllerProperty].callBinding(name, ...args);\n }\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n if ("ab" in value)\n return base64ToTypedArray(value.ab.b, Uint8Array).buffer;\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n if (isArrayBuffer(value))\n return { ab: { b: typedArrayToBase64(new Uint8Array(value)) } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n if (typeof value === "function" && value.name.startsWith(kFunctionBindingPrefix))\n return { fn: value.name };\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date,\n AbortSignal: global.AbortSignal\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n'; + } +}); + +// packages/playwright-core/src/server/javascript.ts +async function evaluate(context2, returnByValue, pageFunction, ...args) { + return evaluateExpression(context2, String(pageFunction), { returnByValue, isFunction: typeof pageFunction === "function" }, ...args); +} +async function evaluateExpression(context2, expression2, options, ...args) { + expression2 = normalizeEvaluationExpression(expression2, options.isFunction); + const handles = []; + const toDispose = []; + const pushHandle = (handle) => { + handles.push(handle); + return handles.length - 1; + }; + args = args.map((arg) => serializeAsCallArgument(arg, (handle) => { + if (handle instanceof JSHandle) { + if (!handle._objectId) + return { fallThrough: handle._value }; + if (handle._disposed) + throw new JavaScriptErrorInEvaluate("JSHandle is disposed!"); + const adopted = context2.adoptIfNeeded(handle); + if (adopted === null) + return { h: pushHandle(Promise.resolve(handle)) }; + toDispose.push(adopted); + return { h: pushHandle(adopted) }; + } + return { fallThrough: handle }; + })); + const utilityScriptObjects = []; + for (const handle of await Promise.all(handles)) { + if (handle._context !== context2) + throw new JavaScriptErrorInEvaluate("JSHandles can be evaluated only in the context they were created!"); + utilityScriptObjects.push(handle); + } + const utilityScriptValues = [options.isFunction, options.returnByValue, expression2, args.length, ...args]; + const script = `(utilityScript, ...args) => utilityScript.evaluate(...args)`; + try { + return await context2._evaluateWithArguments(script, options.returnByValue || false, utilityScriptValues, utilityScriptObjects); + } finally { + toDispose.map((handlePromise) => handlePromise.then((handle) => handle.dispose())); + } +} +function parseUnserializableValue(unserializableValue) { + if (unserializableValue === "NaN") + return NaN; + if (unserializableValue === "Infinity") + return Infinity; + if (unserializableValue === "-Infinity") + return -Infinity; + if (unserializableValue === "-0") + return -0; +} +function normalizeEvaluationExpression(expression2, isFunction2) { + expression2 = expression2.trim(); + if (isFunction2) { + try { + new Function("(" + expression2 + ")"); + } catch (e1) { + if (expression2.startsWith("async ")) + expression2 = "async function " + expression2.substring("async ".length); + else + expression2 = "function " + expression2; + try { + new Function("(" + expression2 + ")"); + } catch (e2) { + throw new Error("Passed function is not well-serializable!"); + } + } + } + if (/^(async)?\s*function(\s|\()/.test(expression2)) + expression2 = "(" + expression2 + ")"; + return expression2; +} +function isJavaScriptErrorInEvaluate(error) { + return error instanceof JavaScriptErrorInEvaluate; +} +function sparseArrayToString(entries) { + const arrayEntries = []; + for (const { name, value: value2 } of entries) { + const index = +name; + if (isNaN(index) || index < 0) + continue; + arrayEntries.push({ index, value: value2 }); + } + arrayEntries.sort((a, b) => a.index - b.index); + let lastIndex = -1; + const tokens = []; + for (const { index, value: value2 } of arrayEntries) { + const emptyItems = index - lastIndex - 1; + if (emptyItems === 1) + tokens.push(`empty`); + else if (emptyItems > 1) + tokens.push(`empty x ${emptyItems}`); + tokens.push(String(value2)); + lastIndex = index; + } + return "[" + tokens.join(", ") + "]"; +} +var ExecutionContext, JSHandle, JavaScriptErrorInEvaluate, snapshottedFunctionBuiltins, snapshottedObjectBuiltins, snapshottedTimerBuiltins, saveGlobalsSnapshotSource, mainWorldGlobalsSnapshotSource; +var init_javascript = __esm({ + "packages/playwright-core/src/server/javascript.ts"() { + "use strict"; + init_utilityScriptSerializers(); + init_manualPromise(); + init_debug(); + init_instrumentation(); + init_utilityScriptSource(); + ExecutionContext = class extends SdkObject { + constructor(parent, delegate, worldNameForTest, options) { + super(parent, "execution-context"); + this._contextDestroyedScope = new LongStandingScope(); + this.worldNameForTest = worldNameForTest; + this._noUtilityWorld = options?.noUtilityWorld; + this.delegate = delegate; + } + contextDestroyed(reason) { + this._contextDestroyedScope.close(new Error(reason)); + } + async raceAgainstContextDestroyed(promise) { + return this._contextDestroyedScope.race(promise); + } + rawEvaluateJSON(expression2) { + return this.raceAgainstContextDestroyed(this.delegate.rawEvaluateJSON(expression2)); + } + rawEvaluateHandle(expression2) { + return this.raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, expression2)); + } + async _evaluateWithArguments(expression2, returnByValue, values, handles) { + const utilityScript = await this._utilityScript(); + return this.raceAgainstContextDestroyed(this.delegate.evaluateWithArguments(expression2, returnByValue, utilityScript, values, handles)); + } + getProperties(object) { + return this.raceAgainstContextDestroyed(this.delegate.getProperties(object)); + } + _releaseHandle(handle) { + return this.delegate.releaseHandle(handle); + } + adoptIfNeeded(handle) { + return null; + } + _utilityScript() { + if (!this._utilityScriptPromise) { + const globalsSnapshot = this._noUtilityWorld ? mainWorldGlobalsSnapshotSource : ""; + const source12 = ` + (() => { + ${globalsSnapshot} + const module = {}; + ${source3} + return new (module.exports.UtilityScript())(globalThis, ${isUnderTest()}); + })();`; + this._utilityScriptPromise = this.raceAgainstContextDestroyed(this.delegate.rawEvaluateHandle(this, source12)).then((handle) => { + handle._setPreview("UtilityScript"); + return handle; + }); + } + return this._utilityScriptPromise; + } + }; + JSHandle = class extends SdkObject { + constructor(context2, type3, preview, objectId, value2) { + super(context2, "handle"); + this.__jshandle = true; + this._disposed = false; + this._context = context2; + this._objectId = objectId; + this._value = value2; + this._objectType = type3; + this._preview = this._objectId ? preview || `JSHandle@${this._objectType}` : String(value2); + if (this._objectId && globalThis.leakedJSHandles) + globalThis.leakedJSHandles.set(this, new Error("Leaked JSHandle")); + } + async evaluateExpression(progress2, expression2, options, arg) { + return await progress2.race(this.internalEvaluateExpression(expression2, options, arg)); + } + async evaluateExpressionHandle(progress2, expression2, options, arg) { + return await progress2.race(this._evaluateExpressionHandle(expression2, options, arg)); + } + async getProperty(progress2, propertyName) { + return await progress2.race(this._getProperty(propertyName)); + } + async getProperties(progress2) { + return await progress2.race(this.internalGetProperties()); + } + async jsonValue(progress2) { + return await progress2.race(this._jsonValue()); + } + async evaluate(pageFunction, arg) { + return evaluate(this._context, true, pageFunction, this, arg); + } + async evaluateHandle(pageFunction, arg) { + return evaluate(this._context, false, pageFunction, this, arg); + } + async internalEvaluateExpression(expression2, options, arg) { + return await evaluateExpression(this._context, expression2, { ...options, returnByValue: true }, this, arg); + } + async _evaluateExpressionHandle(expression2, options, arg) { + return await evaluateExpression(this._context, expression2, { ...options, returnByValue: false }, this, arg); + } + async _getProperty(propertyName) { + const objectHandle = await this.evaluateHandle((object, propertyName2) => { + const result3 = { __proto__: null }; + result3[propertyName2] = object[propertyName2]; + return result3; + }, propertyName); + const properties = await objectHandle.internalGetProperties(); + const result2 = properties.get(propertyName); + objectHandle.dispose(); + return result2; + } + async internalGetProperties() { + if (!this._objectId) + return /* @__PURE__ */ new Map(); + return this._context.getProperties(this); + } + rawValue() { + return this._value; + } + async _jsonValue() { + if (!this._objectId) + return this._value; + const script = `(utilityScript, ...args) => utilityScript.jsonValue(...args)`; + return this._context._evaluateWithArguments(script, true, [true], [this]); + } + asElement() { + return null; + } + dispose() { + if (this._disposed) + return; + this._disposed = true; + if (this._objectId) { + this._context._releaseHandle(this).catch((e) => { + }); + if (globalThis.leakedJSHandles) + globalThis.leakedJSHandles.delete(this); + } + } + toString() { + return this._preview; + } + _setPreviewCallback(callback) { + this._previewCallback = callback; + } + preview() { + return this._preview; + } + worldNameForTest() { + return this._context.worldNameForTest; + } + _setPreview(preview) { + this._preview = preview; + if (this._previewCallback) + this._previewCallback(preview); + } + }; + JavaScriptErrorInEvaluate = class extends Error { + }; + snapshottedFunctionBuiltins = [ + // DOM + "Node", + "Element", + "NodeFilter", + "HTMLElement", + "Document", + "ShadowRoot", + "MutationObserver", + "Event", + "CustomEvent", + "EventTarget", + // JS standard + "Map", + "Set", + "WeakMap", + "WeakSet", + "Promise", + "Symbol", + "Error", + "TypeError", + "RegExp", + "Array", + "Object" + ]; + snapshottedObjectBuiltins = ["JSON", "Math"]; + snapshottedTimerBuiltins = ["setTimeout"]; + saveGlobalsSnapshotSource = `window.__pwSnapshotGlobals = { +${[...snapshottedFunctionBuiltins, ...snapshottedObjectBuiltins, ...snapshottedTimerBuiltins].map((n) => ` ${n}: window.${n}`).join(",\n")} +};`; + mainWorldGlobalsSnapshotSource = ` + const __snap = globalThis.__pwSnapshotGlobals || {}; +${snapshottedFunctionBuiltins.map((n) => ` const ${n} = (typeof globalThis.${n} === 'function' ? globalThis.${n} : __snap.${n});`).join("\n")} +${snapshottedObjectBuiltins.map((n) => ` const ${n} = (typeof globalThis.${n} === 'object' && globalThis.${n} ? globalThis.${n} : __snap.${n});`).join("\n")} +`; + } +}); + +// packages/playwright-core/src/server/fileUploadUtils.ts +async function filesExceedUploadLimit(files) { + const sizes = await Promise.all(files.map(async (file) => (await import_fs13.default.promises.stat(file)).size)); + return sizes.reduce((total, size) => total + size, 0) >= fileUploadSizeLimit; +} +async function prepareFilesForUpload(frame, params2) { + const { payloads, streams, directoryStream } = params2; + let { localPaths, localDirectory } = params2; + if (localPaths && !frame.attribution.playwright.options.isClientCollocatedWithServer) + throw new Error("localPaths are not allowed when the client is not local"); + if ([payloads, localPaths, localDirectory, streams, directoryStream].filter(Boolean).length !== 1) + throw new Error("Exactly one of payloads, localPaths and streams must be provided"); + if (streams) + localPaths = streams.map((c) => c.path()); + if (directoryStream) + localDirectory = directoryStream.path(); + if (localPaths) { + for (const p of localPaths) + assert(import_path13.default.isAbsolute(p) && import_path13.default.resolve(p) === p, "Paths provided to localPaths must be absolute and fully resolved."); + } + let fileBuffers = payloads; + if (!frame._page.browserContext._browser._isBrowserCollocatedWithServer) { + if (localPaths) { + if (await filesExceedUploadLimit(localPaths)) + throw new Error("Cannot transfer files larger than 50Mb to a browser not co-located with the server"); + fileBuffers = await Promise.all(localPaths.map(async (item) => { + return { + name: import_path13.default.basename(item), + buffer: await import_fs13.default.promises.readFile(item), + lastModifiedMs: (await import_fs13.default.promises.stat(item)).mtimeMs + }; + })); + localPaths = void 0; + } + } + const filePayloads = fileBuffers?.map((payload) => ({ + name: payload.name, + mimeType: payload.mimeType || mime4.getType(payload.name) || "application/octet-stream", + buffer: payload.buffer.toString("base64"), + lastModifiedMs: payload.lastModifiedMs + })); + return { localPaths, localDirectory, filePayloads }; +} +var import_fs13, import_path13, mime4, fileUploadSizeLimit; +var init_fileUploadUtils = __esm({ + "packages/playwright-core/src/server/fileUploadUtils.ts"() { + "use strict"; + import_fs13 = __toESM(require("fs")); + import_path13 = __toESM(require("path")); + init_assert(); + mime4 = require("./utilsBundle").mime; + fileUploadSizeLimit = 50 * 1024 * 1024; + } +}); + +// packages/playwright-core/src/generated/injectedScriptSource.ts +var source4; +var init_injectedScriptSource = __esm({ + "packages/playwright-core/src/generated/injectedScriptSource.ts"() { + "use strict"; + source4 = '\nvar __commonJS = obj => {\n let required = false;\n let result;\n return function __require() {\n if (!required) {\n required = true;\n let fn;\n for (const name in obj) { fn = obj[name]; break; }\n const module = { exports: {} };\n fn(module.exports, module);\n result = module.exports;\n }\n return result;\n }\n};\nvar __export = (target, all) => {for (var name in all) target[name] = all[name];};\nvar __toESM = mod => ({ ...mod, \'default\': mod });\nvar __toCommonJS = mod => ({ ...mod, __esModule: true });\n\n\n// packages/injected/src/injectedScript.ts\nvar injectedScript_exports = {};\n__export(injectedScript_exports, {\n InjectedScript: () => InjectedScript\n});\nmodule.exports = __toCommonJS(injectedScript_exports);\n\n// packages/isomorphic/ariaSnapshot.ts\nfunction hasPointerCursor(ariaNode) {\n return ariaNode.box.cursor === "pointer";\n}\nfunction parseAriaSnapshot(yaml, text, options = {}) {\n var _a;\n const lineCounter = new yaml.LineCounter();\n const parseOptions = {\n keepSourceTokens: true,\n lineCounter,\n ...options\n };\n const yamlDoc = yaml.parseDocument(text, parseOptions);\n const errors = [];\n const convertRange = (range) => {\n return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])];\n };\n const addError = (error) => {\n errors.push({\n message: error.message,\n range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])]\n });\n };\n const convertSeq = (container, seq) => {\n for (const item of seq.items) {\n const itemIsString = item instanceof yaml.Scalar && typeof item.value === "string";\n if (itemIsString) {\n const childNode = KeyParser.parse(item, parseOptions, errors);\n if (childNode) {\n container.children = container.children || [];\n container.children.push(childNode);\n }\n continue;\n }\n const itemIsMap = item instanceof yaml.YAMLMap;\n if (itemIsMap) {\n convertMap(container, item);\n continue;\n }\n errors.push({\n message: "Sequence items should be strings or maps",\n range: convertRange(item.range || seq.range)\n });\n }\n };\n const convertMap = (container, map) => {\n var _a2;\n for (const entry of map.items) {\n container.children = container.children || [];\n const keyIsString = entry.key instanceof yaml.Scalar && typeof entry.key.value === "string";\n if (!keyIsString) {\n errors.push({\n message: "Only string keys are supported",\n range: convertRange(entry.key.range || map.range)\n });\n continue;\n }\n const key = entry.key;\n const value = entry.value;\n if (key.value === "text") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Text value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n kind: "text",\n text: textValue(value.value)\n });\n continue;\n }\n if (key.value === "/children") {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString || value.value !== "contain" && value.value !== "equal" && value.value !== "deep-equal") {\n errors.push({\n message: \'Strict value should be "contain", "equal" or "deep-equal"\',\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.containerMode = value.value;\n continue;\n }\n if (key.value.startsWith("/")) {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === "string";\n if (!valueIsString) {\n errors.push({\n message: "Property value should be a string",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.props = (_a2 = container.props) != null ? _a2 : {};\n container.props[key.value.slice(1)] = textValue(value.value);\n continue;\n }\n const childNode = KeyParser.parse(key, parseOptions, errors);\n if (!childNode)\n continue;\n const valueIsScalar = value instanceof yaml.Scalar;\n if (valueIsScalar) {\n const type = typeof value.value;\n if (type !== "string" && type !== "number" && type !== "boolean") {\n errors.push({\n message: "Node value should be a string or a sequence",\n range: convertRange(entry.value.range || map.range)\n });\n continue;\n }\n container.children.push({\n ...childNode,\n children: [{\n kind: "text",\n text: textValue(String(value.value))\n }]\n });\n continue;\n }\n const valueIsSequence = value instanceof yaml.YAMLSeq;\n if (valueIsSequence) {\n container.children.push(childNode);\n convertSeq(childNode, value);\n continue;\n }\n errors.push({\n message: "Map values should be strings or sequences",\n range: convertRange(entry.value.range || map.range)\n });\n }\n };\n const fragment = { kind: "role", role: "fragment" };\n yamlDoc.errors.forEach(addError);\n if (errors.length)\n return { errors, fragment };\n if (!(yamlDoc.contents instanceof yaml.YAMLSeq)) {\n errors.push({\n message: \'Aria snapshot must be a YAML sequence, elements starting with " -"\',\n range: yamlDoc.contents ? convertRange(yamlDoc.contents.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }]\n });\n }\n if (errors.length)\n return { errors, fragment };\n convertSeq(fragment, yamlDoc.contents);\n if (errors.length)\n return { errors, fragment: emptyFragment };\n if (((_a = fragment.children) == null ? void 0 : _a.length) === 1 && (!fragment.containerMode || fragment.containerMode === "contain"))\n return { fragment: fragment.children[0], errors: [] };\n return { fragment, errors: [] };\n}\nvar emptyFragment = { kind: "role", role: "fragment" };\nfunction normalizeWhitespace(text) {\n return text.replace(/[\\u200b\\u00ad]/g, "").replace(/[\\r\\n\\s\\t]+/g, " ").trim();\n}\nfunction textValue(value) {\n return {\n raw: value,\n normalized: normalizeWhitespace(value)\n };\n}\nvar KeyParser = class _KeyParser {\n static parse(text, options, errors) {\n try {\n return new _KeyParser(text.value)._parse();\n } catch (e) {\n if (e instanceof ParserError) {\n const message = options.prettyErrors === false ? e.message : e.message + ":\\n\\n" + text.value + "\\n" + " ".repeat(e.pos) + "^\\n";\n errors.push({\n message,\n range: [options.lineCounter.linePos(text.range[0]), options.lineCounter.linePos(text.range[0] + e.pos)]\n });\n return null;\n }\n throw e;\n }\n }\n constructor(input) {\n this._input = input;\n this._pos = 0;\n this._length = input.length;\n }\n _peek() {\n return this._input[this._pos] || "";\n }\n _next() {\n if (this._pos < this._length)\n return this._input[this._pos++];\n return null;\n }\n _eof() {\n return this._pos >= this._length;\n }\n _isWhitespace() {\n return !this._eof() && /\\s/.test(this._peek());\n }\n _skipWhitespace() {\n while (this._isWhitespace())\n this._pos++;\n }\n _readIdentifier(type) {\n if (this._eof())\n this._throwError(`Unexpected end of input when expecting ${type}`);\n const start = this._pos;\n while (!this._eof() && /[a-zA-Z]/.test(this._peek()))\n this._pos++;\n return this._input.slice(start, this._pos);\n }\n _readString() {\n let result = "";\n let escaped = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n } else if (ch === \'"\') {\n return result;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated string");\n }\n _throwError(message, offset = 0) {\n throw new ParserError(message, offset || this._pos);\n }\n _readRegex() {\n let result = "";\n let escaped = false;\n let insideClass = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === "\\\\") {\n escaped = true;\n result += ch;\n } else if (ch === "/" && !insideClass) {\n return { pattern: result };\n } else if (ch === "[") {\n insideClass = true;\n result += ch;\n } else if (ch === "]" && insideClass) {\n result += ch;\n insideClass = false;\n } else {\n result += ch;\n }\n }\n this._throwError("Unterminated regex");\n }\n _readStringOrRegex() {\n const ch = this._peek();\n if (ch === \'"\') {\n this._next();\n return normalizeWhitespace(this._readString());\n }\n if (ch === "/") {\n this._next();\n return this._readRegex();\n }\n return null;\n }\n _readAttributes(result) {\n let errorPos = this._pos;\n while (true) {\n this._skipWhitespace();\n if (this._peek() === "[") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n const flagName = this._readIdentifier("attribute");\n this._skipWhitespace();\n let flagValue = "";\n if (this._peek() === "=") {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n while (this._peek() !== "]" && !this._isWhitespace() && !this._eof())\n flagValue += this._next();\n }\n this._skipWhitespace();\n if (this._peek() !== "]")\n this._throwError("Expected ]");\n this._next();\n this._applyAttribute(result, flagName, flagValue || "true", errorPos);\n } else {\n break;\n }\n }\n }\n _parse() {\n this._skipWhitespace();\n const role = this._readIdentifier("role");\n this._skipWhitespace();\n const name = this._readStringOrRegex() || "";\n const result = { kind: "role", role, name };\n this._readAttributes(result);\n this._skipWhitespace();\n if (!this._eof())\n this._throwError("Unexpected input");\n return result;\n }\n _applyAttribute(node, key, value, errorPos) {\n if (key === "checked") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "checked" attribute must be a boolean or "mixed"\', errorPos);\n node.checked = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "disabled") {\n this._assert(value === "true" || value === "false", \'Value of "disabled" attribute must be a boolean\', errorPos);\n node.disabled = value === "true";\n return;\n }\n if (key === "expanded") {\n this._assert(value === "true" || value === "false", \'Value of "expanded" attribute must be a boolean\', errorPos);\n node.expanded = value === "true";\n return;\n }\n if (key === "active") {\n this._assert(value === "true" || value === "false", \'Value of "active" attribute must be a boolean\', errorPos);\n node.active = value === "true";\n return;\n }\n if (key === "invalid") {\n this._assert(value === "true" || value === "false" || value === "grammar" || value === "spelling", \'Value of "invalid" attribute must be a boolean, "grammar" or "spelling"\', errorPos);\n node.invalid = value === "true" ? true : value === "false" ? false : value;\n return;\n }\n if (key === "level") {\n this._assert(!isNaN(Number(value)), \'Value of "level" attribute must be a number\', errorPos);\n node.level = Number(value);\n return;\n }\n if (key === "pressed") {\n this._assert(value === "true" || value === "false" || value === "mixed", \'Value of "pressed" attribute must be a boolean or "mixed"\', errorPos);\n node.pressed = value === "true" ? true : value === "false" ? false : "mixed";\n return;\n }\n if (key === "selected") {\n this._assert(value === "true" || value === "false", \'Value of "selected" attribute must be a boolean\', errorPos);\n node.selected = value === "true";\n return;\n }\n this._assert(false, `Unsupported attribute [${key}]`, errorPos);\n }\n _assert(value, message, valuePos) {\n if (!value)\n this._throwError(message || "Assertion error", valuePos);\n }\n};\nvar ParserError = class extends Error {\n constructor(message, pos) {\n super(message);\n this.pos = pos;\n }\n};\nfunction findNewNode(from, to) {\n var _a, _b;\n function fillMap(root, map, position) {\n let size = 1;\n let childPosition = position + size;\n for (const child of root.children || []) {\n if (typeof child === "string") {\n size++;\n childPosition++;\n } else {\n size += fillMap(child, map, childPosition);\n childPosition += size;\n }\n }\n if (!["none", "presentation", "fragment", "iframe", "generic"].includes(root.role) && root.name) {\n let byRole = map.get(root.role);\n if (!byRole) {\n byRole = /* @__PURE__ */ new Map();\n map.set(root.role, byRole);\n }\n const existing = byRole.get(root.name);\n const sizeAndPosition = size * 100 - position;\n if (!existing || existing.sizeAndPosition < sizeAndPosition)\n byRole.set(root.name, { node: root, sizeAndPosition });\n }\n return size;\n }\n const fromMap = /* @__PURE__ */ new Map();\n if (from)\n fillMap(from, fromMap, 0);\n const toMap = /* @__PURE__ */ new Map();\n fillMap(to, toMap, 0);\n const result = [];\n for (const [role, byRole] of toMap) {\n for (const [name, byName] of byRole) {\n const inFrom = (_a = fromMap.get(role)) == null ? void 0 : _a.get(name);\n if (!inFrom)\n result.push(byName);\n }\n }\n result.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition);\n return (_b = result[0]) == null ? void 0 : _b.node;\n}\n\n// packages/isomorphic/cssTokenizer.ts\nvar between = function(num, first, last) {\n return num >= first && num <= last;\n};\nfunction digit(code) {\n return between(code, 48, 57);\n}\nfunction hexdigit(code) {\n return digit(code) || between(code, 65, 70) || between(code, 97, 102);\n}\nfunction uppercaseletter(code) {\n return between(code, 65, 90);\n}\nfunction lowercaseletter(code) {\n return between(code, 97, 122);\n}\nfunction letter(code) {\n return uppercaseletter(code) || lowercaseletter(code);\n}\nfunction nonascii(code) {\n return code >= 128;\n}\nfunction namestartchar(code) {\n return letter(code) || nonascii(code) || code === 95;\n}\nfunction namechar(code) {\n return namestartchar(code) || digit(code) || code === 45;\n}\nfunction nonprintable(code) {\n return between(code, 0, 8) || code === 11 || between(code, 14, 31) || code === 127;\n}\nfunction newline(code) {\n return code === 10;\n}\nfunction whitespace(code) {\n return newline(code) || code === 9 || code === 32;\n}\nvar maximumallowedcodepoint = 1114111;\nvar InvalidCharacterError = class extends Error {\n constructor(message) {\n super(message);\n this.name = "InvalidCharacterError";\n }\n};\nfunction preprocess(str) {\n const codepoints = [];\n for (let i = 0; i < str.length; i++) {\n let code = str.charCodeAt(i);\n if (code === 13 && str.charCodeAt(i + 1) === 10) {\n code = 10;\n i++;\n }\n if (code === 13 || code === 12)\n code = 10;\n if (code === 0)\n code = 65533;\n if (between(code, 55296, 56319) && between(str.charCodeAt(i + 1), 56320, 57343)) {\n const lead = code - 55296;\n const trail = str.charCodeAt(i + 1) - 56320;\n code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail;\n i++;\n }\n codepoints.push(code);\n }\n return codepoints;\n}\nfunction stringFromCode(code) {\n if (code <= 65535)\n return String.fromCharCode(code);\n code -= Math.pow(2, 16);\n const lead = Math.floor(code / Math.pow(2, 10)) + 55296;\n const trail = code % Math.pow(2, 10) + 56320;\n return String.fromCharCode(lead) + String.fromCharCode(trail);\n}\nfunction tokenize(str1) {\n const str = preprocess(str1);\n let i = -1;\n const tokens = [];\n let code;\n let line = 0;\n let column = 0;\n let lastLineLength = 0;\n const incrLineno = function() {\n line += 1;\n lastLineLength = column;\n column = 0;\n };\n const locStart = { line, column };\n const codepoint = function(i2) {\n if (i2 >= str.length)\n return -1;\n return str[i2];\n };\n const next = function(num) {\n if (num === void 0)\n num = 1;\n if (num > 3)\n throw "Spec Error: no more than three codepoints of lookahead.";\n return codepoint(i + num);\n };\n const consume = function(num) {\n if (num === void 0)\n num = 1;\n i += num;\n code = codepoint(i);\n if (newline(code))\n incrLineno();\n else\n column += num;\n return true;\n };\n const reconsume = function() {\n i -= 1;\n if (newline(code)) {\n line -= 1;\n column = lastLineLength;\n } else {\n column -= 1;\n }\n locStart.line = line;\n locStart.column = column;\n return true;\n };\n const eof = function(codepoint2) {\n if (codepoint2 === void 0)\n codepoint2 = code;\n return codepoint2 === -1;\n };\n const donothing = function() {\n };\n const parseerror = function() {\n };\n const consumeAToken = function() {\n consumeComments();\n consume();\n if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n return new WhitespaceToken();\n } else if (code === 34) {\n return consumeAStringToken();\n } else if (code === 35) {\n if (namechar(next()) || areAValidEscape(next(1), next(2))) {\n const token = new HashToken("");\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n token.type = "id";\n token.value = consumeAName();\n return token;\n } else {\n return new DelimToken(code);\n }\n } else if (code === 36) {\n if (next() === 61) {\n consume();\n return new SuffixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 39) {\n return consumeAStringToken();\n } else if (code === 40) {\n return new OpenParenToken();\n } else if (code === 41) {\n return new CloseParenToken();\n } else if (code === 42) {\n if (next() === 61) {\n consume();\n return new SubstringMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 43) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 44) {\n return new CommaToken();\n } else if (code === 45) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else if (next(1) === 45 && next(2) === 62) {\n consume(2);\n return new CDCToken();\n } else if (startsWithAnIdentifier()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 46) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 58) {\n return new ColonToken();\n } else if (code === 59) {\n return new SemicolonToken();\n } else if (code === 60) {\n if (next(1) === 33 && next(2) === 45 && next(3) === 45) {\n consume(3);\n return new CDOToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 64) {\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n return new AtKeywordToken(consumeAName());\n else\n return new DelimToken(code);\n } else if (code === 91) {\n return new OpenSquareToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n parseerror();\n return new DelimToken(code);\n }\n } else if (code === 93) {\n return new CloseSquareToken();\n } else if (code === 94) {\n if (next() === 61) {\n consume();\n return new PrefixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 123) {\n return new OpenCurlyToken();\n } else if (code === 124) {\n if (next() === 61) {\n consume();\n return new DashMatchToken();\n } else if (next() === 124) {\n consume();\n return new ColumnToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 125) {\n return new CloseCurlyToken();\n } else if (code === 126) {\n if (next() === 61) {\n consume();\n return new IncludeMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (digit(code)) {\n reconsume();\n return consumeANumericToken();\n } else if (namestartchar(code)) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else if (eof()) {\n return new EOFToken();\n } else {\n return new DelimToken(code);\n }\n };\n const consumeComments = function() {\n while (next(1) === 47 && next(2) === 42) {\n consume(2);\n while (true) {\n consume();\n if (code === 42 && next() === 47) {\n consume();\n break;\n } else if (eof()) {\n parseerror();\n return;\n }\n }\n }\n };\n const consumeANumericToken = function() {\n const num = consumeANumber();\n if (wouldStartAnIdentifier(next(1), next(2), next(3))) {\n const token = new DimensionToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n token.unit = consumeAName();\n return token;\n } else if (next() === 37) {\n consume();\n const token = new PercentageToken();\n token.value = num.value;\n token.repr = num.repr;\n return token;\n } else {\n const token = new NumberToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n return token;\n }\n };\n const consumeAnIdentlikeToken = function() {\n const str2 = consumeAName();\n if (str2.toLowerCase() === "url" && next() === 40) {\n consume();\n while (whitespace(next(1)) && whitespace(next(2)))\n consume();\n if (next() === 34 || next() === 39)\n return new FunctionToken(str2);\n else if (whitespace(next()) && (next(2) === 34 || next(2) === 39))\n return new FunctionToken(str2);\n else\n return consumeAURLToken();\n } else if (next() === 40) {\n consume();\n return new FunctionToken(str2);\n } else {\n return new IdentToken(str2);\n }\n };\n const consumeAStringToken = function(endingCodePoint) {\n if (endingCodePoint === void 0)\n endingCodePoint = code;\n let string = "";\n while (consume()) {\n if (code === endingCodePoint || eof()) {\n return new StringToken(string);\n } else if (newline(code)) {\n parseerror();\n reconsume();\n return new BadStringToken();\n } else if (code === 92) {\n if (eof(next()))\n donothing();\n else if (newline(next()))\n consume();\n else\n string += stringFromCode(consumeEscape());\n } else {\n string += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeAURLToken = function() {\n const token = new URLToken("");\n while (whitespace(next()))\n consume();\n if (eof(next()))\n return token;\n while (consume()) {\n if (code === 41 || eof()) {\n return token;\n } else if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n if (next() === 41 || eof(next())) {\n consume();\n return token;\n } else {\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else if (code === 34 || code === 39 || code === 40 || nonprintable(code)) {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n } else if (code === 92) {\n if (startsWithAValidEscape()) {\n token.value += stringFromCode(consumeEscape());\n } else {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else {\n token.value += stringFromCode(code);\n }\n }\n throw new Error("Internal error");\n };\n const consumeEscape = function() {\n consume();\n if (hexdigit(code)) {\n const digits = [code];\n for (let total = 0; total < 5; total++) {\n if (hexdigit(next())) {\n consume();\n digits.push(code);\n } else {\n break;\n }\n }\n if (whitespace(next()))\n consume();\n let value = parseInt(digits.map(function(x) {\n return String.fromCharCode(x);\n }).join(""), 16);\n if (value > maximumallowedcodepoint)\n value = 65533;\n return value;\n } else if (eof()) {\n return 65533;\n } else {\n return code;\n }\n };\n const areAValidEscape = function(c1, c2) {\n if (c1 !== 92)\n return false;\n if (newline(c2))\n return false;\n return true;\n };\n const startsWithAValidEscape = function() {\n return areAValidEscape(code, next());\n };\n const wouldStartAnIdentifier = function(c1, c2, c3) {\n if (c1 === 45)\n return namestartchar(c2) || c2 === 45 || areAValidEscape(c2, c3);\n else if (namestartchar(c1))\n return true;\n else if (c1 === 92)\n return areAValidEscape(c1, c2);\n else\n return false;\n };\n const startsWithAnIdentifier = function() {\n return wouldStartAnIdentifier(code, next(1), next(2));\n };\n const wouldStartANumber = function(c1, c2, c3) {\n if (c1 === 43 || c1 === 45) {\n if (digit(c2))\n return true;\n if (c2 === 46 && digit(c3))\n return true;\n return false;\n } else if (c1 === 46) {\n if (digit(c2))\n return true;\n return false;\n } else if (digit(c1)) {\n return true;\n } else {\n return false;\n }\n };\n const startsWithANumber = function() {\n return wouldStartANumber(code, next(1), next(2));\n };\n const consumeAName = function() {\n let result = "";\n while (consume()) {\n if (namechar(code)) {\n result += stringFromCode(code);\n } else if (startsWithAValidEscape()) {\n result += stringFromCode(consumeEscape());\n } else {\n reconsume();\n return result;\n }\n }\n throw new Error("Internal parse error");\n };\n const consumeANumber = function() {\n let repr = "";\n let type = "integer";\n if (next() === 43 || next() === 45) {\n consume();\n repr += stringFromCode(code);\n }\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n if (next(1) === 46 && digit(next(2))) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const c1 = next(1);\n const c2 = next(2);\n const c3 = next(3);\n if ((c1 === 69 || c1 === 101) && digit(c2)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n } else if ((c1 === 69 || c1 === 101) && (c2 === 43 || c2 === 45) && digit(c3)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = "number";\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const value = convertAStringToANumber(repr);\n return { type, value, repr };\n };\n const convertAStringToANumber = function(string) {\n return +string;\n };\n const consumeTheRemnantsOfABadURL = function() {\n while (consume()) {\n if (code === 41 || eof()) {\n return;\n } else if (startsWithAValidEscape()) {\n consumeEscape();\n donothing();\n } else {\n donothing();\n }\n }\n };\n let iterationCount = 0;\n while (!eof(next())) {\n tokens.push(consumeAToken());\n iterationCount++;\n if (iterationCount > str.length * 2)\n throw new Error("I\'m infinite-looping!");\n }\n return tokens;\n}\nvar CSSParserToken = class {\n constructor() {\n this.tokenType = "";\n }\n toJSON() {\n return { token: this.tokenType };\n }\n toString() {\n return this.tokenType;\n }\n toSource() {\n return "" + this;\n }\n};\nvar BadStringToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADSTRING";\n }\n};\nvar BadURLToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "BADURL";\n }\n};\nvar WhitespaceToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "WHITESPACE";\n }\n toString() {\n return "WS";\n }\n toSource() {\n return " ";\n }\n};\nvar CDOToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "CDO";\n }\n toSource() {\n return "";\n }\n};\nvar ColonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ":";\n }\n};\nvar SemicolonToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ";";\n }\n};\nvar CommaToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = ",";\n }\n};\nvar GroupingToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n this.mirror = "";\n }\n};\nvar OpenCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "{";\n this.value = "{";\n this.mirror = "}";\n }\n};\nvar CloseCurlyToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "}";\n this.value = "}";\n this.mirror = "{";\n }\n};\nvar OpenSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "[";\n this.value = "[";\n this.mirror = "]";\n }\n};\nvar CloseSquareToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "]";\n this.value = "]";\n this.mirror = "[";\n }\n};\nvar OpenParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = "(";\n this.value = "(";\n this.mirror = ")";\n }\n};\nvar CloseParenToken = class extends GroupingToken {\n constructor() {\n super();\n this.tokenType = ")";\n this.value = ")";\n this.mirror = "(";\n }\n};\nvar IncludeMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "~=";\n }\n};\nvar DashMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "|=";\n }\n};\nvar PrefixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "^=";\n }\n};\nvar SuffixMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "$=";\n }\n};\nvar SubstringMatchToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "*=";\n }\n};\nvar ColumnToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "||";\n }\n};\nvar EOFToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.tokenType = "EOF";\n }\n toSource() {\n return "";\n }\n};\nvar DelimToken = class extends CSSParserToken {\n constructor(code) {\n super();\n this.tokenType = "DELIM";\n this.value = "";\n this.value = stringFromCode(code);\n }\n toString() {\n return "DELIM(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n toSource() {\n if (this.value === "\\\\")\n return "\\\\\\n";\n else\n return this.value;\n }\n};\nvar StringValuedToken = class extends CSSParserToken {\n constructor() {\n super(...arguments);\n this.value = "";\n }\n ASCIIMatch(str) {\n return this.value.toLowerCase() === str.toLowerCase();\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n};\nvar IdentToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "IDENT";\n this.value = val;\n }\n toString() {\n return "IDENT(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value);\n }\n};\nvar FunctionToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "FUNCTION";\n this.value = val;\n this.mirror = ")";\n }\n toString() {\n return "FUNCTION(" + this.value + ")";\n }\n toSource() {\n return escapeIdent(this.value) + "(";\n }\n};\nvar AtKeywordToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "AT-KEYWORD";\n this.value = val;\n }\n toString() {\n return "AT(" + this.value + ")";\n }\n toSource() {\n return "@" + escapeIdent(this.value);\n }\n};\nvar HashToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "HASH";\n this.value = val;\n this.type = "unrestricted";\n }\n toString() {\n return "HASH(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n return json;\n }\n toSource() {\n if (this.type === "id")\n return "#" + escapeIdent(this.value);\n else\n return "#" + escapeHash(this.value);\n }\n};\nvar StringToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "STRING";\n this.value = val;\n }\n toString() {\n return \'"\' + escapeString(this.value) + \'"\';\n }\n};\nvar URLToken = class extends StringValuedToken {\n constructor(val) {\n super();\n this.tokenType = "URL";\n this.value = val;\n }\n toString() {\n return "URL(" + this.value + ")";\n }\n toSource() {\n return \'url("\' + escapeString(this.value) + \'")\';\n }\n};\nvar NumberToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "NUMBER";\n this.type = "integer";\n this.repr = "";\n }\n toString() {\n if (this.type === "integer")\n return "INT(" + this.value + ")";\n return "NUMBER(" + this.value + ")";\n }\n toJSON() {\n const json = super.toJSON();\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr;\n }\n};\nvar PercentageToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "PERCENTAGE";\n this.repr = "";\n }\n toString() {\n return "PERCENTAGE(" + this.value + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.repr = this.repr;\n return json;\n }\n toSource() {\n return this.repr + "%";\n }\n};\nvar DimensionToken = class extends CSSParserToken {\n constructor() {\n super();\n this.tokenType = "DIMENSION";\n this.type = "integer";\n this.repr = "";\n this.unit = "";\n }\n toString() {\n return "DIM(" + this.value + "," + this.unit + ")";\n }\n toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n json.unit = this.unit;\n return json;\n }\n toSource() {\n const source = this.repr;\n let unit = escapeIdent(this.unit);\n if (unit[0].toLowerCase() === "e" && (unit[1] === "-" || between(unit.charCodeAt(1), 48, 57))) {\n unit = "\\\\65 " + unit.slice(1, unit.length);\n }\n return source + unit;\n }\n};\nfunction escapeIdent(string) {\n string = "" + string;\n let result = "";\n const firstcode = string.charCodeAt(0);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127 || i === 0 && between(code, 48, 57) || i === 1 && between(code, 48, 57) && firstcode === 45)\n result += "\\\\" + code.toString(16) + " ";\n else if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + string[i];\n }\n return result;\n}\nfunction escapeHash(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (code >= 128 || code === 45 || code === 95 || between(code, 48, 57) || between(code, 65, 90) || between(code, 97, 122))\n result += string[i];\n else\n result += "\\\\" + code.toString(16) + " ";\n }\n return result;\n}\nfunction escapeString(string) {\n string = "" + string;\n let result = "";\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0)\n throw new InvalidCharacterError("Invalid character: the input contains U+0000.");\n if (between(code, 1, 31) || code === 127)\n result += "\\\\" + code.toString(16) + " ";\n else if (code === 34 || code === 92)\n result += "\\\\" + string[i];\n else\n result += string[i];\n }\n return result;\n}\n\n// packages/isomorphic/cssParser.ts\nvar InvalidSelectorError = class extends Error {\n};\nfunction parseCSS(selector, customNames) {\n let tokens;\n try {\n tokens = tokenize(selector);\n if (!(tokens[tokens.length - 1] instanceof EOFToken))\n tokens.push(new EOFToken());\n } catch (e) {\n const newMessage = e.message + ` while parsing css selector "${selector}". Did you mean to CSS.escape it?`;\n const index = (e.stack || "").indexOf(e.message);\n if (index !== -1)\n e.stack = e.stack.substring(0, index) + newMessage + e.stack.substring(index + e.message.length);\n e.message = newMessage;\n throw e;\n }\n const unsupportedToken = tokens.find((token) => {\n return token instanceof AtKeywordToken || token instanceof BadStringToken || token instanceof BadURLToken || token instanceof ColumnToken || token instanceof CDOToken || token instanceof CDCToken || token instanceof SemicolonToken || // TODO: Consider using these for something, e.g. to escape complex strings.\n // For example :xpath{ (//div/bar[@attr="foo"])[2]/baz }\n // Or this way :xpath( {complex-xpath-goes-here("hello")} )\n token instanceof OpenCurlyToken || token instanceof CloseCurlyToken || // TODO: Consider treating these as strings?\n token instanceof URLToken || token instanceof PercentageToken;\n });\n if (unsupportedToken)\n throw new InvalidSelectorError(`Unsupported token "${unsupportedToken.toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n let pos = 0;\n const names = /* @__PURE__ */ new Set();\n function unexpected() {\n return new InvalidSelectorError(`Unexpected token "${tokens[pos].toSource()}" while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n }\n function skipWhitespace() {\n while (tokens[pos] instanceof WhitespaceToken)\n pos++;\n }\n function isIdent(p = pos) {\n return tokens[p] instanceof IdentToken;\n }\n function isString(p = pos) {\n return tokens[p] instanceof StringToken;\n }\n function isNumber(p = pos) {\n return tokens[p] instanceof NumberToken;\n }\n function isComma(p = pos) {\n return tokens[p] instanceof CommaToken;\n }\n function isOpenParen(p = pos) {\n return tokens[p] instanceof OpenParenToken;\n }\n function isCloseParen(p = pos) {\n return tokens[p] instanceof CloseParenToken;\n }\n function isFunction(p = pos) {\n return tokens[p] instanceof FunctionToken;\n }\n function isStar(p = pos) {\n return tokens[p] instanceof DelimToken && tokens[p].value === "*";\n }\n function isEOF(p = pos) {\n return tokens[p] instanceof EOFToken;\n }\n function isClauseCombinator(p = pos) {\n return tokens[p] instanceof DelimToken && [">", "+", "~"].includes(tokens[p].value);\n }\n function isSelectorClauseEnd(p = pos) {\n return isComma(p) || isCloseParen(p) || isEOF(p) || isClauseCombinator(p) || tokens[p] instanceof WhitespaceToken;\n }\n function consumeFunctionArguments() {\n const result2 = [consumeArgument()];\n while (true) {\n skipWhitespace();\n if (!isComma())\n break;\n pos++;\n result2.push(consumeArgument());\n }\n return result2;\n }\n function consumeArgument() {\n skipWhitespace();\n if (isNumber())\n return tokens[pos++].value;\n if (isString())\n return tokens[pos++].value;\n return consumeComplexSelector();\n }\n function consumeComplexSelector() {\n const result2 = { simples: [] };\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples.push({ selector: { functions: [{ name: "scope", args: [] }] }, combinator: "" });\n } else {\n result2.simples.push({ selector: consumeSimpleSelector(), combinator: "" });\n }\n while (true) {\n skipWhitespace();\n if (isClauseCombinator()) {\n result2.simples[result2.simples.length - 1].combinator = tokens[pos++].value;\n skipWhitespace();\n } else if (isSelectorClauseEnd()) {\n break;\n }\n result2.simples.push({ combinator: "", selector: consumeSimpleSelector() });\n }\n return result2;\n }\n function consumeSimpleSelector() {\n let rawCSSString = "";\n const functions = [];\n while (!isSelectorClauseEnd()) {\n if (isIdent() || isStar()) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof HashToken) {\n rawCSSString += tokens[pos++].toSource();\n } else if (tokens[pos] instanceof DelimToken && tokens[pos].value === ".") {\n pos++;\n if (isIdent())\n rawCSSString += "." + tokens[pos++].toSource();\n else\n throw unexpected();\n } else if (tokens[pos] instanceof ColonToken) {\n pos++;\n if (isIdent()) {\n if (!customNames.has(tokens[pos].value.toLowerCase())) {\n rawCSSString += ":" + tokens[pos++].toSource();\n } else {\n const name = tokens[pos++].value.toLowerCase();\n functions.push({ name, args: [] });\n names.add(name);\n }\n } else if (isFunction()) {\n const name = tokens[pos++].value.toLowerCase();\n if (!customNames.has(name)) {\n rawCSSString += `:${name}(${consumeBuiltinFunctionArguments()})`;\n } else {\n functions.push({ name, args: consumeFunctionArguments() });\n names.add(name);\n }\n skipWhitespace();\n if (!isCloseParen())\n throw unexpected();\n pos++;\n } else {\n throw unexpected();\n }\n } else if (tokens[pos] instanceof OpenSquareToken) {\n rawCSSString += "[";\n pos++;\n while (!(tokens[pos] instanceof CloseSquareToken) && !isEOF())\n rawCSSString += tokens[pos++].toSource();\n if (!(tokens[pos] instanceof CloseSquareToken))\n throw unexpected();\n rawCSSString += "]";\n pos++;\n } else {\n throw unexpected();\n }\n }\n if (!rawCSSString && !functions.length)\n throw unexpected();\n return { css: rawCSSString || void 0, functions };\n }\n function consumeBuiltinFunctionArguments() {\n let s = "";\n let balance = 1;\n while (!isEOF()) {\n if (isOpenParen() || isFunction())\n balance++;\n if (isCloseParen())\n balance--;\n if (!balance)\n break;\n s += tokens[pos++].toSource();\n }\n return s;\n }\n const result = consumeFunctionArguments();\n if (!isEOF())\n throw unexpected();\n if (result.some((arg) => typeof arg !== "object" || !("simples" in arg)))\n throw new InvalidSelectorError(`Error while parsing css selector "${selector}". Did you mean to CSS.escape it?`);\n return { selector: result, names: Array.from(names) };\n}\n\n// packages/isomorphic/selectorParser.ts\nvar kNestedSelectorNames = /* @__PURE__ */ new Set(["internal:has", "internal:has-not", "internal:and", "internal:or", "internal:chain", "left-of", "right-of", "above", "below", "near"]);\nvar kNestedSelectorNamesWithDistance = /* @__PURE__ */ new Set(["left-of", "right-of", "above", "below", "near"]);\nvar customCSSNames = /* @__PURE__ */ new Set(["not", "is", "where", "has", "scope", "light", "visible", "text", "text-matches", "text-is", "has-text", "above", "below", "right-of", "left-of", "near", "nth-match"]);\nfunction parseSelector(selector) {\n const parsedStrings = parseSelectorString(selector);\n const parts = [];\n for (const part of parsedStrings.parts) {\n if (part.name === "css" || part.name === "css:light") {\n if (part.name === "css:light")\n part.body = ":light(" + part.body + ")";\n const parsedCSS = parseCSS(part.body, customCSSNames);\n parts.push({\n name: "css",\n body: parsedCSS.selector,\n source: part.body\n });\n continue;\n }\n if (kNestedSelectorNames.has(part.name)) {\n let innerSelector;\n let distance;\n try {\n const unescaped = JSON.parse("[" + part.body + "]");\n if (!Array.isArray(unescaped) || unescaped.length < 1 || unescaped.length > 2 || typeof unescaped[0] !== "string")\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n innerSelector = unescaped[0];\n if (unescaped.length === 2) {\n if (typeof unescaped[1] !== "number" || !kNestedSelectorNamesWithDistance.has(part.name))\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n distance = unescaped[1];\n }\n } catch (e) {\n throw new InvalidSelectorError(`Malformed selector: ${part.name}=` + part.body);\n }\n const nested = { name: part.name, source: part.body, body: { parsed: parseSelector(innerSelector), distance } };\n const lastFrame = [...nested.body.parsed.parts].reverse().find((part2) => part2.name === "internal:control" && part2.body === "enter-frame");\n const lastFrameIndex = lastFrame ? nested.body.parsed.parts.indexOf(lastFrame) : -1;\n if (lastFrameIndex !== -1 && selectorPartsEqual(nested.body.parsed.parts.slice(0, lastFrameIndex + 1), parts.slice(0, lastFrameIndex + 1)))\n nested.body.parsed.parts.splice(0, lastFrameIndex + 1);\n parts.push(nested);\n continue;\n }\n parts.push({ ...part, source: part.body });\n }\n if (kNestedSelectorNames.has(parts[0].name))\n throw new InvalidSelectorError(`"${parts[0].name}" selector cannot be first`);\n return {\n capture: parsedStrings.capture,\n parts\n };\n}\nfunction selectorPartsEqual(list1, list2) {\n return stringifySelector({ parts: list1 }) === stringifySelector({ parts: list2 });\n}\nfunction stringifySelector(selector, forceEngineName) {\n if (typeof selector === "string")\n return selector;\n return selector.parts.map((p, i) => {\n let includeEngine = true;\n if (!forceEngineName && i !== selector.capture) {\n if (p.name === "css")\n includeEngine = false;\n else if (p.name === "xpath" && (p.source.startsWith("//") || p.source.startsWith("..")))\n includeEngine = false;\n }\n const prefix = includeEngine ? p.name + "=" : "";\n return `${i === selector.capture ? "*" : ""}${prefix}${p.source}`;\n }).join(" >> ");\n}\nfunction visitAllSelectorParts(selector, visitor) {\n const visit = (selector2, nested) => {\n for (const part of selector2.parts) {\n visitor(part, nested);\n if (kNestedSelectorNames.has(part.name))\n visit(part.body.parsed, true);\n }\n };\n visit(selector, false);\n}\nfunction parseSelectorString(selector) {\n let index = 0;\n let quote;\n let start = 0;\n const result = { parts: [] };\n const append = () => {\n const part = selector.substring(start, index).trim();\n const eqIndex = part.indexOf("=");\n let name;\n let body;\n if (eqIndex !== -1 && part.substring(0, eqIndex).trim().match(/^[a-zA-Z_0-9-+:*]+$/)) {\n name = part.substring(0, eqIndex).trim();\n body = part.substring(eqIndex + 1);\n } else if (part.length > 1 && part[0] === \'"\' && part[part.length - 1] === \'"\') {\n name = "text";\n body = part;\n } else if (part.length > 1 && part[0] === "\'" && part[part.length - 1] === "\'") {\n name = "text";\n body = part;\n } else if (/^\\(*\\/\\//.test(part) || part.startsWith("..")) {\n name = "xpath";\n body = part;\n } else {\n name = "css";\n body = part;\n }\n let capture = false;\n if (name[0] === "*") {\n capture = true;\n name = name.substring(1);\n }\n result.parts.push({ name, body });\n if (capture) {\n if (result.capture !== void 0)\n throw new InvalidSelectorError(`Only one of the selectors can capture using * modifier`);\n result.capture = result.parts.length - 1;\n }\n };\n if (!selector.includes(">>")) {\n index = selector.length;\n append();\n return result;\n }\n const shouldIgnoreTextSelectorQuote = () => {\n const prefix = selector.substring(start, index);\n const match = prefix.match(/^\\s*text\\s*=(.*)$/);\n return !!match && !!match[1];\n };\n while (index < selector.length) {\n const c = selector[index];\n if (c === "\\\\" && index + 1 < selector.length) {\n index += 2;\n } else if (c === quote) {\n quote = void 0;\n index++;\n } else if (!quote && (c === \'"\' || c === "\'" || c === "`") && !shouldIgnoreTextSelectorQuote()) {\n quote = c;\n index++;\n } else if (!quote && c === ">" && selector[index + 1] === ">") {\n append();\n index += 2;\n start = index;\n } else {\n index++;\n }\n }\n append();\n return result;\n}\nfunction parseAttributeSelector(selector, allowUnquotedStrings) {\n let wp = 0;\n let EOL = selector.length === 0;\n const next = () => selector[wp] || "";\n const eat1 = () => {\n const result2 = next();\n ++wp;\n EOL = wp >= selector.length;\n return result2;\n };\n const syntaxError = (stage) => {\n if (EOL)\n throw new InvalidSelectorError(`Unexpected end of selector while parsing selector \\`${selector}\\``);\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - unexpected symbol "${next()}" at position ${wp}` + (stage ? " during " + stage : ""));\n };\n function skipSpaces() {\n while (!EOL && /\\s/.test(next()))\n eat1();\n }\n function isCSSNameChar(char) {\n return char >= "\\x80" || char >= "0" && char <= "9" || char >= "A" && char <= "Z" || char >= "a" && char <= "z" || char >= "0" && char <= "9" || char === "_" || char === "-";\n }\n function readIdentifier() {\n let result2 = "";\n skipSpaces();\n while (!EOL && isCSSNameChar(next()))\n result2 += eat1();\n return result2;\n }\n function readQuotedString(quote) {\n let result2 = eat1();\n if (result2 !== quote)\n syntaxError("parsing quoted string");\n while (!EOL && next() !== quote) {\n if (next() === "\\\\")\n eat1();\n result2 += eat1();\n }\n if (next() !== quote)\n syntaxError("parsing quoted string");\n result2 += eat1();\n return result2;\n }\n function readRegularExpression() {\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let source = "";\n let inClass = false;\n while (!EOL) {\n if (next() === "\\\\") {\n source += eat1();\n if (EOL)\n syntaxError("parsing regular expression");\n } else if (inClass && next() === "]") {\n inClass = false;\n } else if (!inClass && next() === "[") {\n inClass = true;\n } else if (!inClass && next() === "/") {\n break;\n }\n source += eat1();\n }\n if (eat1() !== "/")\n syntaxError("parsing regular expression");\n let flags = "";\n while (!EOL && next().match(/[dgimsuvy]/))\n flags += eat1();\n try {\n return new RegExp(source, flags);\n } catch (e) {\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\`: ${e.message}`);\n }\n }\n function readAttributeToken() {\n let token = "";\n skipSpaces();\n if (next() === `\'` || next() === `"`)\n token = readQuotedString(next()).slice(1, -1);\n else\n token = readIdentifier();\n if (!token)\n syntaxError("parsing property path");\n return token;\n }\n function readOperator() {\n skipSpaces();\n let op = "";\n if (!EOL)\n op += eat1();\n if (!EOL && op !== "=")\n op += eat1();\n if (!["=", "*=", "^=", "$=", "|=", "~="].includes(op))\n syntaxError("parsing operator");\n return op;\n }\n function readAttribute() {\n eat1();\n const jsonPath = [];\n jsonPath.push(readAttributeToken());\n skipSpaces();\n while (next() === ".") {\n eat1();\n jsonPath.push(readAttributeToken());\n skipSpaces();\n }\n if (next() === "]") {\n eat1();\n return { name: jsonPath.join("."), jsonPath, op: "", value: null, caseSensitive: false };\n }\n const operator = readOperator();\n let value = void 0;\n let caseSensitive = true;\n skipSpaces();\n if (next() === "/") {\n if (operator !== "=")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with regular expression`);\n value = readRegularExpression();\n } else if (next() === `\'` || next() === `"`) {\n value = readQuotedString(next()).slice(1, -1);\n skipSpaces();\n if (next() === "i" || next() === "I") {\n caseSensitive = false;\n eat1();\n } else if (next() === "s" || next() === "S") {\n caseSensitive = true;\n eat1();\n }\n } else {\n value = "";\n while (!EOL && (isCSSNameChar(next()) || next() === "+" || next() === "."))\n value += eat1();\n if (value === "true") {\n value = true;\n } else if (value === "false") {\n value = false;\n } else {\n if (!allowUnquotedStrings) {\n value = +value;\n if (Number.isNaN(value))\n syntaxError("parsing attribute value");\n }\n }\n }\n skipSpaces();\n if (next() !== "]")\n syntaxError("parsing attribute value");\n eat1();\n if (operator !== "=" && typeof value !== "string")\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - cannot use ${operator} in attribute with non-string matching value - ${value}`);\n return { name: jsonPath.join("."), jsonPath, op: operator, value, caseSensitive };\n }\n const result = {\n name: "",\n attributes: []\n };\n result.name = readIdentifier();\n skipSpaces();\n while (next() === "[") {\n result.attributes.push(readAttribute());\n skipSpaces();\n }\n if (!EOL)\n syntaxError(void 0);\n if (!result.name && !result.attributes.length)\n throw new InvalidSelectorError(`Error while parsing selector \\`${selector}\\` - selector cannot be empty`);\n return result;\n}\n\n// packages/isomorphic/stringUtils.ts\nfunction escapeWithQuotes(text, char = "\'") {\n const stringified = JSON.stringify(text);\n const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\\\"/g, \'"\');\n if (char === "\'")\n return char + escapedText.replace(/[\']/g, "\\\\\'") + char;\n if (char === \'"\')\n return char + escapedText.replace(/["]/g, \'\\\\"\') + char;\n if (char === "`")\n return char + escapedText.replace(/[`]/g, "\\\\`") + char;\n throw new Error("Invalid escape char");\n}\nfunction toTitleCase(name) {\n return name.charAt(0).toUpperCase() + name.substring(1);\n}\nfunction toSnakeCase(name) {\n return name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").toLowerCase();\n}\nfunction quoteCSSAttributeValue(text) {\n return `"${text.replace(/["\\\\]/g, (char) => "\\\\" + char)}"`;\n}\nvar normalizedWhitespaceCache;\nfunction cacheNormalizedWhitespaces() {\n normalizedWhitespaceCache = /* @__PURE__ */ new Map();\n}\nfunction normalizeWhiteSpace(text) {\n let result = normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.get(text);\n if (result === void 0) {\n result = text.replace(/[\\u200b\\u00ad]/g, "").trim().replace(/\\s+/g, " ");\n normalizedWhitespaceCache == null ? void 0 : normalizedWhitespaceCache.set(text, result);\n }\n return result;\n}\nfunction normalizeEscapedRegexQuotes(source) {\n return source.replace(/(^|[^\\\\])(\\\\\\\\)*\\\\([\'"`])/g, "$1$2$3");\n}\nfunction escapeRegexForSelector(re) {\n if (re.unicode || re.unicodeSets)\n return String(re);\n return String(re).replace(/(^|[^\\\\])(\\\\\\\\)*(["\'`])/g, "$1$2\\\\$3").replace(/>>/g, "\\\\>\\\\>");\n}\nfunction escapeForTextSelector(text, exact) {\n if (typeof text !== "string")\n return escapeRegexForSelector(text);\n return `${JSON.stringify(text)}${exact ? "s" : "i"}`;\n}\nfunction escapeForAttributeSelector(value, exact) {\n if (typeof value !== "string")\n return escapeRegexForSelector(value);\n return `"${value.replace(/\\\\/g, "\\\\\\\\").replace(/["]/g, \'\\\\"\')}"${exact ? "s" : "i"}`;\n}\nfunction trimString(input, cap, suffix = "") {\n if (input.length <= cap)\n return input;\n const chars = [...input];\n if (chars.length > cap)\n return chars.slice(0, cap - suffix.length).join("") + suffix;\n return chars.join("");\n}\nfunction trimStringWithEllipsis(input, cap) {\n return trimString(input, cap, "\\u2026");\n}\nfunction truncateDataUrl(url) {\n if (!url.startsWith("data:"))\n return url;\n const comma = url.indexOf(",");\n if (comma === -1)\n return url;\n return url.slice(0, comma + 1) + "\\u2026";\n}\nfunction escapeRegExp(s) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, "\\\\$&");\n}\nfunction longestCommonSubstring(s1, s2) {\n const n = s1.length;\n const m = s2.length;\n let maxLen = 0;\n let endingIndex = 0;\n const dp = Array(n + 1).fill(null).map(() => Array(m + 1).fill(0));\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (s1[i - 1] === s2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n if (dp[i][j] > maxLen) {\n maxLen = dp[i][j];\n endingIndex = i;\n }\n }\n }\n }\n return s1.slice(endingIndex - maxLen, endingIndex);\n}\nvar ansiRegex = new RegExp("([\\\\u001B\\\\u009B][[\\\\]()#?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)|(?:(?:\\\\d{0,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~])))", "g");\n\n// packages/isomorphic/locatorGenerators.ts\nfunction asLocator(lang, selector, isFrameLocator = false) {\n return asLocators(lang, selector, isFrameLocator, 1)[0];\n}\nfunction asLocators(lang, selector, isFrameLocator = false, maxOutputSize = 20, preferredQuote) {\n try {\n return innerAsLocators(new generators[lang](preferredQuote), parseSelector(selector), isFrameLocator, maxOutputSize);\n } catch (e) {\n return [selector];\n }\n}\nfunction innerAsLocators(factory, parsed, isFrameLocator = false, maxOutputSize = 20) {\n const parts = [...parsed.parts];\n const tokens = [];\n let nextBase = isFrameLocator ? "frame-locator" : "page";\n for (let index = 0; index < parts.length; index++) {\n const part = parts[index];\n const base = nextBase;\n nextBase = "locator";\n if (part.name === "internal:describe")\n continue;\n if (part.name === "nth") {\n if (part.body === "0")\n tokens.push([factory.generateLocator(base, "first", ""), factory.generateLocator(base, "nth", "0")]);\n else if (part.body === "-1")\n tokens.push([factory.generateLocator(base, "last", ""), factory.generateLocator(base, "nth", "-1")]);\n else\n tokens.push([factory.generateLocator(base, "nth", part.body)]);\n continue;\n }\n if (part.name === "visible") {\n tokens.push([factory.generateLocator(base, "visible", part.body), factory.generateLocator(base, "default", `visible=${part.body}`)]);\n continue;\n }\n if (part.name === "internal:text") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "text", text, { exact })]);\n continue;\n }\n if (part.name === "internal:has-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has-not-text") {\n const { exact, text } = detectExact(part.body);\n if (!exact) {\n tokens.push([factory.generateLocator(base, "has-not-text", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:has") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "has", inner)));\n continue;\n }\n if (part.name === "internal:has-not") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "hasNot", inner)));\n continue;\n }\n if (part.name === "internal:and") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "and", inner)));\n continue;\n }\n if (part.name === "internal:or") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "or", inner)));\n continue;\n }\n if (part.name === "internal:chain") {\n const inners = innerAsLocators(factory, part.body.parsed, false, maxOutputSize);\n tokens.push(inners.map((inner) => factory.generateLocator(base, "chain", inner)));\n continue;\n }\n if (part.name === "internal:label") {\n const { exact, text } = detectExact(part.body);\n tokens.push([factory.generateLocator(base, "label", text, { exact })]);\n continue;\n }\n if (part.name === "internal:role") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const options = { attrs: [] };\n for (const attr of attrSelector.attributes) {\n if (attr.name === "name") {\n if (options.exact !== void 0 && options.exact !== attr.caseSensitive)\n throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);\n options.exact = attr.caseSensitive;\n options.name = attr.value;\n } else if (attr.name === "description") {\n if (options.exact !== void 0 && options.exact !== attr.caseSensitive)\n throw new Error(`Conflicting exactness in internal:role selector: ${stringifySelector({ parts: [part] })}`);\n options.exact = attr.caseSensitive;\n options.description = attr.value;\n } else {\n if (attr.name === "level" && typeof attr.value === "string")\n attr.value = +attr.value;\n options.attrs.push({ name: attr.name === "include-hidden" ? "includeHidden" : attr.name, value: attr.value });\n }\n }\n tokens.push([factory.generateLocator(base, "role", attrSelector.name, options)]);\n continue;\n }\n if (part.name === "internal:testid") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { value } = attrSelector.attributes[0];\n tokens.push([factory.generateLocator(base, "test-id", value)]);\n continue;\n }\n if (part.name === "internal:attr") {\n const attrSelector = parseAttributeSelector(part.body, true);\n const { name, value, caseSensitive } = attrSelector.attributes[0];\n const text = value;\n const exact = !!caseSensitive;\n if (name === "placeholder") {\n tokens.push([factory.generateLocator(base, "placeholder", text, { exact })]);\n continue;\n }\n if (name === "alt") {\n tokens.push([factory.generateLocator(base, "alt", text, { exact })]);\n continue;\n }\n if (name === "title") {\n tokens.push([factory.generateLocator(base, "title", text, { exact })]);\n continue;\n }\n }\n if (part.name === "internal:control" && part.body === "enter-frame") {\n const lastTokens = tokens[tokens.length - 1];\n const lastPart = parts[index - 1];\n const transformed = lastTokens.map((token) => factory.chainLocators([token, factory.generateLocator(base, "frame", "")]));\n if (["xpath", "css"].includes(lastPart.name)) {\n transformed.push(\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] })),\n factory.generateLocator(base, "frame-locator", stringifySelector({ parts: [lastPart] }, true))\n );\n }\n lastTokens.splice(0, lastTokens.length, ...transformed);\n nextBase = "frame-locator";\n continue;\n }\n const nextPart = parts[index + 1];\n const selectorPart = stringifySelector({ parts: [part] });\n const locatorPart = factory.generateLocator(base, "default", selectorPart);\n if (nextPart && ["internal:has-text", "internal:has-not-text"].includes(nextPart.name)) {\n const { exact, text } = detectExact(nextPart.body);\n if (!exact) {\n const nextLocatorPart = factory.generateLocator("locator", nextPart.name === "internal:has-text" ? "has-text" : "has-not-text", text, { exact });\n const options = {};\n if (nextPart.name === "internal:has-text")\n options.hasText = text;\n else\n options.hasNotText = text;\n const combinedPart = factory.generateLocator(base, "default", selectorPart, options);\n tokens.push([factory.chainLocators([locatorPart, nextLocatorPart]), combinedPart]);\n index++;\n continue;\n }\n }\n let locatorPartWithEngine;\n if (["xpath", "css"].includes(part.name)) {\n const selectorPart2 = stringifySelector(\n { parts: [part] },\n /* forceEngineName */\n true\n );\n locatorPartWithEngine = factory.generateLocator(base, "default", selectorPart2);\n }\n tokens.push([locatorPart, locatorPartWithEngine].filter(Boolean));\n }\n return combineTokens(factory, tokens, maxOutputSize);\n}\nfunction combineTokens(factory, tokens, maxOutputSize) {\n const currentTokens = tokens.map(() => "");\n const result = [];\n const visit = (index) => {\n if (index === tokens.length) {\n result.push(factory.chainLocators(currentTokens));\n return result.length < maxOutputSize;\n }\n for (const taken of tokens[index]) {\n currentTokens[index] = taken;\n if (!visit(index + 1))\n return false;\n }\n return true;\n };\n visit(0);\n return result;\n}\nfunction detectExact(text) {\n let exact = false;\n const match = text.match(/^\\/(.*)\\/([igm]*)$/);\n if (match)\n return { text: new RegExp(match[1], match[2]) };\n if (text.endsWith(\'"\')) {\n text = JSON.parse(text);\n exact = true;\n } else if (text.endsWith(\'"s\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = true;\n } else if (text.endsWith(\'"i\')) {\n text = JSON.parse(text.substring(0, text.length - 1));\n exact = false;\n }\n return { exact, text };\n}\nvar JavaScriptLocatorFactory = class {\n constructor(preferredQuote) {\n this.preferredQuote = preferredQuote;\n }\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, { hasText: ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, { hasNotText: ${this.toHasText(options.hasNotText)} })`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter({ visible: ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`name: ${this.regexToSourceString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`name: ${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`description: ${this.regexToSourceString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`description: ${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`exact: true`);\n for (const { name, value } of options.attrs)\n attrs.push(`${name}: ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, { ${attrs.join(", ")} }` : "";\n return `getByRole(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter({ hasText: ${this.toHasText(body)} })`;\n case "has-not-text":\n return `filter({ hasNotText: ${this.toHasText(body)} })`;\n case "has":\n return `filter({ has: ${body} })`;\n case "hasNot":\n return `filter({ hasNot: ${body} })`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToSourceString(re) {\n return normalizeEscapedRegexQuotes(String(re));\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToSourceString(body)})`;\n return exact ? `${method}(${this.quote(body)}, { exact: true })` : `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToSourceString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToSourceString(value);\n return this.quote(value);\n }\n quote(text) {\n var _a;\n return escapeWithQuotes(text, (_a = this.preferredQuote) != null ? _a : "\'");\n }\n};\nvar PythonLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, has_text=${this.toHasText(options.hasText)})`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, has_not_text=${this.toHasText(options.hasNotText)})`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frame_locator(${this.quote(body)})`;\n case "frame":\n return `content_frame`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first`;\n case "last":\n return `last`;\n case "visible":\n return `filter(visible=${body === "true" ? "True" : "False"})`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`name=${this.regexToString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`name=${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`description=${this.regexToString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`description=${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`exact=True`);\n for (const { name, value } of options.attrs) {\n let valueString = typeof value === "string" ? this.quote(value) : value;\n if (typeof value === "boolean")\n valueString = value ? "True" : "False";\n attrs.push(`${toSnakeCase(name)}=${valueString}`);\n }\n const attrString = attrs.length ? `, ${attrs.join(", ")}` : "";\n return `get_by_role(${this.quote(body)}${attrString})`;\n case "has-text":\n return `filter(has_text=${this.toHasText(body)})`;\n case "has-not-text":\n return `filter(has_not_text=${this.toHasText(body)})`;\n case "has":\n return `filter(has=${body})`;\n case "hasNot":\n return `filter(has_not=${body})`;\n case "and":\n return `and_(${body})`;\n case "or":\n return `or_(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `get_by_test_id(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("get_by_text", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("get_by_alt_text", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("get_by_placeholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("get_by_label", body, !!options.exact);\n case "title":\n return this.toCallWithExact("get_by_title", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", re.IGNORECASE" : "";\n return `re.compile(r"${normalizeEscapedRegexQuotes(body.source).replace(/\\\\\\//, "/").replace(/"/g, \'\\\\"\')}"${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, exact=True)`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return `${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JavaLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n let clazz;\n switch (base) {\n case "page":\n clazz = "Page";\n break;\n case "frame-locator":\n clazz = "FrameLocator";\n break;\n case "locator":\n clazz = "Locator";\n break;\n }\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasText(${this.toHasText(options.hasText)}))`;\n if (options.hasNotText !== void 0)\n return `locator(${this.quote(body)}, new ${clazz}.LocatorOptions().setHasNotText(${this.toHasText(options.hasNotText)}))`;\n return `locator(${this.quote(body)})`;\n case "frame-locator":\n return `frameLocator(${this.quote(body)})`;\n case "frame":\n return `contentFrame()`;\n case "nth":\n return `nth(${body})`;\n case "first":\n return `first()`;\n case "last":\n return `last()`;\n case "visible":\n return `filter(new ${clazz}.FilterOptions().setVisible(${body === "true" ? "true" : "false"}))`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`.setName(${this.regexToString(options.name)})`);\n else if (typeof options.name === "string")\n attrs.push(`.setName(${this.quote(options.name)})`);\n if (isRegExp(options.description))\n attrs.push(`.setDescription(${this.regexToString(options.description)})`);\n else if (typeof options.description === "string")\n attrs.push(`.setDescription(${this.quote(options.description)})`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`.setExact(true)`);\n for (const { name, value } of options.attrs)\n attrs.push(`.set${toTitleCase(name)}(${typeof value === "string" ? this.quote(value) : value})`);\n const attrString = attrs.length ? `, new ${clazz}.GetByRoleOptions()${attrs.join("")}` : "";\n return `getByRole(AriaRole.${toSnakeCase(body).toUpperCase()}${attrString})`;\n case "has-text":\n return `filter(new ${clazz}.FilterOptions().setHasText(${this.toHasText(body)}))`;\n case "has-not-text":\n return `filter(new ${clazz}.FilterOptions().setHasNotText(${this.toHasText(body)}))`;\n case "has":\n return `filter(new ${clazz}.FilterOptions().setHas(${body}))`;\n case "hasNot":\n return `filter(new ${clazz}.FilterOptions().setHasNot(${body}))`;\n case "and":\n return `and(${body})`;\n case "or":\n return `or(${body})`;\n case "chain":\n return `locator(${body})`;\n case "test-id":\n return `getByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact(clazz, "getByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact(clazz, "getByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact(clazz, "getByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact(clazz, "getByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact(clazz, "getByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", Pattern.CASE_INSENSITIVE" : "";\n return `Pattern.compile(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(clazz, method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new ${clazz}.${toTitleCase(method)}Options().setExact(true))`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return this.regexToString(body);\n return this.quote(body);\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar CSharpLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n switch (kind) {\n case "default":\n if (options.hasText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasText(options.hasText)} })`;\n if (options.hasNotText !== void 0)\n return `Locator(${this.quote(body)}, new() { ${this.toHasNotText(options.hasNotText)} })`;\n return `Locator(${this.quote(body)})`;\n case "frame-locator":\n return `FrameLocator(${this.quote(body)})`;\n case "frame":\n return `ContentFrame`;\n case "nth":\n return `Nth(${body})`;\n case "first":\n return `First`;\n case "last":\n return `Last`;\n case "visible":\n return `Filter(new() { Visible = ${body === "true" ? "true" : "false"} })`;\n case "role":\n const attrs = [];\n if (isRegExp(options.name))\n attrs.push(`NameRegex = ${this.regexToString(options.name)}`);\n else if (typeof options.name === "string")\n attrs.push(`Name = ${this.quote(options.name)}`);\n if (isRegExp(options.description))\n attrs.push(`DescriptionRegex = ${this.regexToString(options.description)}`);\n else if (typeof options.description === "string")\n attrs.push(`Description = ${this.quote(options.description)}`);\n if (options.exact && (typeof options.name === "string" || typeof options.description === "string"))\n attrs.push(`Exact = true`);\n for (const { name, value } of options.attrs)\n attrs.push(`${toTitleCase(name)} = ${typeof value === "string" ? this.quote(value) : value}`);\n const attrString = attrs.length ? `, new() { ${attrs.join(", ")} }` : "";\n return `GetByRole(AriaRole.${toTitleCase(body)}${attrString})`;\n case "has-text":\n return `Filter(new() { ${this.toHasText(body)} })`;\n case "has-not-text":\n return `Filter(new() { ${this.toHasNotText(body)} })`;\n case "has":\n return `Filter(new() { Has = ${body} })`;\n case "hasNot":\n return `Filter(new() { HasNot = ${body} })`;\n case "and":\n return `And(${body})`;\n case "or":\n return `Or(${body})`;\n case "chain":\n return `Locator(${body})`;\n case "test-id":\n return `GetByTestId(${this.toTestIdValue(body)})`;\n case "text":\n return this.toCallWithExact("GetByText", body, !!options.exact);\n case "alt":\n return this.toCallWithExact("GetByAltText", body, !!options.exact);\n case "placeholder":\n return this.toCallWithExact("GetByPlaceholder", body, !!options.exact);\n case "label":\n return this.toCallWithExact("GetByLabel", body, !!options.exact);\n case "title":\n return this.toCallWithExact("GetByTitle", body, !!options.exact);\n default:\n throw new Error("Unknown selector kind " + kind);\n }\n }\n chainLocators(locators) {\n return locators.join(".");\n }\n regexToString(body) {\n const suffix = body.flags.includes("i") ? ", RegexOptions.IgnoreCase" : "";\n return `new Regex(${this.quote(normalizeEscapedRegexQuotes(body.source))}${suffix})`;\n }\n toCallWithExact(method, body, exact) {\n if (isRegExp(body))\n return `${method}(${this.regexToString(body)})`;\n if (exact)\n return `${method}(${this.quote(body)}, new() { Exact = true })`;\n return `${method}(${this.quote(body)})`;\n }\n toHasText(body) {\n if (isRegExp(body))\n return `HasTextRegex = ${this.regexToString(body)}`;\n return `HasText = ${this.quote(body)}`;\n }\n toTestIdValue(value) {\n if (isRegExp(value))\n return this.regexToString(value);\n return this.quote(value);\n }\n toHasNotText(body) {\n if (isRegExp(body))\n return `HasNotTextRegex = ${this.regexToString(body)}`;\n return `HasNotText = ${this.quote(body)}`;\n }\n quote(text) {\n return escapeWithQuotes(text, \'"\');\n }\n};\nvar JsonlLocatorFactory = class {\n generateLocator(base, kind, body, options = {}) {\n return JSON.stringify({\n kind,\n body,\n options\n });\n }\n chainLocators(locators) {\n const objects = locators.map((l) => JSON.parse(l));\n for (let i = 0; i < objects.length - 1; ++i) {\n let tail = objects[i];\n while (tail.next)\n tail = tail.next;\n tail.next = objects[i + 1];\n }\n return JSON.stringify(objects[0]);\n }\n};\nvar generators = {\n javascript: JavaScriptLocatorFactory,\n python: PythonLocatorFactory,\n java: JavaLocatorFactory,\n csharp: CSharpLocatorFactory,\n jsonl: JsonlLocatorFactory\n};\nfunction isRegExp(obj) {\n return obj instanceof RegExp;\n}\n\n// packages/isomorphic/locatorUtils.ts\nfunction getByAttributeTextSelector(attrName, text, options) {\n return `internal:attr=[${attrName}=${escapeForAttributeSelector(text, (options == null ? void 0 : options.exact) || false)}]`;\n}\nfunction splitTestIdAttributeNames(testIdAttributeName) {\n return testIdAttributeName.split(",");\n}\nfunction encodeTestIdAttributeName(testIdAttributeName) {\n return testIdAttributeName.includes(",") ? JSON.stringify(testIdAttributeName) : testIdAttributeName;\n}\nfunction getByTestIdSelector(testIdAttributeName, testId) {\n return `internal:testid=[${encodeTestIdAttributeName(testIdAttributeName)}=${escapeForAttributeSelector(testId, true)}]`;\n}\nfunction getByLabelSelector(text, options) {\n return "internal:label=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByAltTextSelector(text, options) {\n return getByAttributeTextSelector("alt", text, options);\n}\nfunction getByTitleSelector(text, options) {\n return getByAttributeTextSelector("title", text, options);\n}\nfunction getByPlaceholderSelector(text, options) {\n return getByAttributeTextSelector("placeholder", text, options);\n}\nfunction getByTextSelector(text, options) {\n return "internal:text=" + escapeForTextSelector(text, !!(options == null ? void 0 : options.exact));\n}\nfunction getByRoleSelector(role, options = {}) {\n const props = [];\n if (options.checked !== void 0)\n props.push(["checked", String(options.checked)]);\n if (options.disabled !== void 0)\n props.push(["disabled", String(options.disabled)]);\n if (options.selected !== void 0)\n props.push(["selected", String(options.selected)]);\n if (options.expanded !== void 0)\n props.push(["expanded", String(options.expanded)]);\n if (options.includeHidden !== void 0)\n props.push(["include-hidden", String(options.includeHidden)]);\n if (options.level !== void 0)\n props.push(["level", String(options.level)]);\n if (options.name !== void 0)\n props.push(["name", escapeForAttributeSelector(options.name, !!options.exact)]);\n if (options.description !== void 0)\n props.push(["description", escapeForAttributeSelector(options.description, !!options.exact)]);\n if (options.pressed !== void 0)\n props.push(["pressed", String(options.pressed)]);\n return `internal:role=${role}${props.map(([n, v]) => `[${n}=${v}]`).join("")}`;\n}\n\n// packages/isomorphic/yaml.ts\nfunction yamlEscapeKeyIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return `\'` + str.replace(/\'/g, `\'\'`) + `\'`;\n}\nfunction yamlEscapeValueIfNeeded(str) {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return \'"\' + str.replace(/[\\\\"\\x00-\\x1f\\x7f-\\x9f]/g, (c) => {\n switch (c) {\n case "\\\\":\n return "\\\\\\\\";\n case \'"\':\n return \'\\\\"\';\n case "\\b":\n return "\\\\b";\n case "\\f":\n return "\\\\f";\n case "\\n":\n return "\\\\n";\n case "\\r":\n return "\\\\r";\n case " ":\n return "\\\\t";\n default:\n const code = c.charCodeAt(0);\n return "\\\\x" + code.toString(16).padStart(2, "0");\n }\n }) + \'"\';\n}\nfunction yamlStringNeedsQuotes(str) {\n if (str.length === 0)\n return true;\n if (/^\\s|\\s$/.test(str))\n return true;\n if (/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/.test(str))\n return true;\n if (/^-/.test(str))\n return true;\n if (/[\\n:](\\s|$)/.test(str))\n return true;\n if (/\\s#/.test(str))\n return true;\n if (/[\\n\\r]/.test(str))\n return true;\n if (/^[&*\\],?!>|@"\'#%]/.test(str))\n return true;\n if (/[{}`]/.test(str))\n return true;\n if (/^\\[/.test(str))\n return true;\n if (!isNaN(Number(str)) || ["y", "n", "yes", "no", "true", "false", "on", "off", "null"].includes(str.toLowerCase()))\n return true;\n return false;\n}\n\n// packages/injected/src/ariaSnapshotDistiller.ts\nfunction distillAriaSnapshot(snapshot, options) {\n runPlugins(snapshot, options.mode === "ai" ? aiPlugins : normalizePlugins, options);\n}\nfunction runPlugins(snapshot, plugins, options) {\n var _a, _b;\n const ctx = { snapshot, depth: -1, maxDepth: options.depth, ancestors: [], pendingContentRefs: /* @__PURE__ */ new Set() };\n const traverse = (node, depth) => {\n const children = [];\n const visitChild = (child) => {\n var _a2, _b2;\n if (typeof child === "string") {\n children.push(child);\n return;\n }\n ctx.depth = depth + 1;\n for (const plugin of plugins) {\n const result = (_a2 = plugin.enter) == null ? void 0 : _a2.call(plugin, child, ctx);\n if (result === "remove")\n return;\n if (result === "unwrap") {\n child.children.forEach(visitChild);\n return;\n }\n }\n traverse(child, depth + 1);\n ctx.depth = depth + 1;\n for (const plugin of plugins) {\n const result = (_b2 = plugin.exit) == null ? void 0 : _b2.call(plugin, child, ctx);\n if (result === "remove")\n return;\n if (result === "unwrap") {\n children.push(...child.children);\n return;\n }\n }\n children.push(child);\n };\n ctx.ancestors.push(node);\n node.children.forEach(visitChild);\n ctx.ancestors.pop();\n node.children = children;\n };\n for (const plugin of plugins)\n (_a = plugin.enter) == null ? void 0 : _a.call(plugin, snapshot.root, ctx);\n traverse(snapshot.root, -1);\n ctx.depth = -1;\n for (const plugin of plugins)\n (_b = plugin.exit) == null ? void 0 : _b.call(plugin, snapshot.root, ctx);\n}\nfunction isLeafGeneric(node) {\n return node.role === "generic" && node.children.every((child) => typeof child === "string");\n}\nfunction isClickTargetRoot(node, ctx) {\n return !!node.ref && hasPointerCursor(node) && !ctx.ancestors.some((ancestor) => !!ancestor.ref && hasPointerCursor(ancestor));\n}\nvar mergeStringChildren = {\n name: "mergeStringChildren",\n exit(node) {\n const children = [];\n const buffer = [];\n const flush = () => {\n if (!buffer.length)\n return;\n const text = normalizeWhiteSpace(buffer.join(""));\n if (text)\n children.push(text);\n buffer.length = 0;\n };\n for (const child of node.children) {\n if (typeof child === "string") {\n buffer.push(child);\n } else {\n flush();\n children.push(child);\n }\n }\n flush();\n node.children = children;\n if (node.children.length === 1 && node.children[0] === node.name)\n node.children = [];\n }\n};\nvar unwrapSingleChildGenerics = {\n name: "unwrapSingleChildGenerics",\n exit(node, ctx) {\n if (node.role !== "generic" || node.name || node.children.length > 1 || !node.children.every((child) => typeof child !== "string" && !!child.ref))\n return;\n if (!node.children.length && isClickTargetRoot(node, ctx))\n return;\n return "unwrap";\n }\n};\nvar removeNamelessImages = {\n name: "removeNamelessImages",\n exit(node, ctx) {\n if (node.role === "img" && !node.name && !node.children.length && !isClickTargetRoot(node, ctx))\n return "remove";\n }\n};\nvar removeRedundantNames = {\n name: "removeRedundantNames",\n enter(node, ctx) {\n var _a;\n if (!node.ref)\n return;\n for (const ref of ((_a = ctx.snapshot.info.get(node.ref)) == null ? void 0 : _a.nameFromContentRefs) || [])\n ctx.pendingContentRefs.add(ref);\n const beyondDepth = !!ctx.maxDepth && ctx.depth > ctx.maxDepth;\n if (!beyondDepth && !isLeafGeneric(node))\n ctx.pendingContentRefs.delete(node.ref);\n },\n exit(node, ctx) {\n var _a;\n if (!node.ref)\n return;\n const nameFromContentRefs = (_a = ctx.snapshot.info.get(node.ref)) == null ? void 0 : _a.nameFromContentRefs;\n if (!(nameFromContentRefs == null ? void 0 : nameFromContentRefs.length))\n return;\n if (nameFromContentRefs.every((ref) => !ctx.pendingContentRefs.has(ref))) {\n node.name = "";\n } else {\n for (const ref of nameFromContentRefs)\n ctx.pendingContentRefs.delete(ref);\n }\n }\n};\nvar removeNameRepeatingChild = {\n name: "removeNameRepeatingChild",\n exit(node, ctx) {\n const parent = ctx.ancestors[ctx.ancestors.length - 1];\n if (!(parent == null ? void 0 : parent.name) || node.role !== "generic" || node.active || Object.keys(node.props).length)\n return;\n const singleTextChild = node.children.length === 1 && typeof node.children[0] === "string" ? node.children[0] : void 0;\n const text = node.name ? node.children.length ? void 0 : node.name : singleTextChild;\n if (text && text === parent.name) {\n if (node.ref)\n ctx.pendingContentRefs.add(node.ref);\n return "remove";\n }\n }\n};\nvar inlineTextIntoGeneric = {\n name: "inlineTextIntoGeneric",\n exit(node) {\n if (node.role !== "generic" || Object.keys(node.props).length || node.children.length !== 1)\n return;\n const child = node.children[0];\n if (typeof child === "string")\n return;\n if (child.role !== "generic" || child.name || child.active || Object.keys(child.props).length)\n return;\n if (child.children.length === 1 && typeof child.children[0] === "string")\n node.children = [child.children[0]];\n }\n};\nvar normalizePlugins = [\n mergeStringChildren,\n unwrapSingleChildGenerics\n];\nvar aiPlugins = [\n mergeStringChildren,\n removeNamelessImages,\n removeRedundantNames,\n inlineTextIntoGeneric,\n removeNameRepeatingChild,\n unwrapSingleChildGenerics\n];\n\n// packages/injected/src/domUtils.ts\nvar globalOptions = {};\nfunction setGlobalOptions(options) {\n globalOptions = options;\n}\nfunction isInsideScope(scope, element) {\n while (element) {\n if (scope.contains(element))\n return true;\n element = enclosingShadowHost(element);\n }\n return false;\n}\nfunction parentElementOrShadowHost(element) {\n if (element.parentElement)\n return element.parentElement;\n if (!element.parentNode)\n return;\n if (element.parentNode.nodeType === 11 && element.parentNode.host)\n return element.parentNode.host;\n}\nfunction enclosingShadowRootOrDocument(element) {\n let node = element;\n while (node.parentNode)\n node = node.parentNode;\n if (node.nodeType === 11 || node.nodeType === 9)\n return node;\n}\nfunction enclosingShadowHost(element) {\n while (element.parentElement)\n element = element.parentElement;\n return parentElementOrShadowHost(element);\n}\nfunction closestCrossShadow(element, css, scope) {\n while (element) {\n const closest = element.closest(css);\n if (scope && closest !== scope && (closest == null ? void 0 : closest.contains(scope)))\n return;\n if (closest)\n return closest;\n element = enclosingShadowHost(element);\n }\n}\nfunction getElementComputedStyle(element, pseudo) {\n const cache = pseudo === "::before" ? cacheStyleBefore : pseudo === "::after" ? cacheStyleAfter : cacheStyle;\n if (cache && cache.has(element))\n return cache.get(element);\n const style = element.ownerDocument && element.ownerDocument.defaultView ? element.ownerDocument.defaultView.getComputedStyle(element, pseudo) : void 0;\n cache == null ? void 0 : cache.set(element, style);\n return style;\n}\nfunction isElementStyleVisibilityVisible(element, style) {\n const cached = cacheStyleVisibility == null ? void 0 : cacheStyleVisibility.get(element);\n if (cached !== void 0)\n return cached;\n const result = computeElementStyleVisibilityVisible(element, style);\n cacheStyleVisibility == null ? void 0 : cacheStyleVisibility.set(element, result);\n return result;\n}\nfunction computeElementStyleVisibilityVisible(element, style) {\n style = style != null ? style : getElementComputedStyle(element);\n if (!style)\n return true;\n if (Element.prototype.checkVisibility && globalOptions.browserNameForWorkarounds !== "webkit") {\n if (!element.checkVisibility())\n return false;\n } else {\n const detailsOrSummary = element.closest("details,summary");\n if (detailsOrSummary !== element && (detailsOrSummary == null ? void 0 : detailsOrSummary.nodeName) === "DETAILS" && !detailsOrSummary.open)\n return false;\n }\n if (style.visibility !== "visible")\n return false;\n return true;\n}\nfunction computeBox(element) {\n const style = getElementComputedStyle(element);\n if (!style)\n return { visible: true, inline: false };\n const cursor = style.cursor;\n if (style.display === "contents") {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && isElementVisible(child))\n return { visible: true, inline: false, cursor };\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return { visible: true, inline: true, cursor };\n }\n return { visible: false, inline: false, cursor };\n }\n if (!isElementStyleVisibilityVisible(element, style))\n return { cursor, visible: false, inline: false };\n const rect = element.getBoundingClientRect();\n return { cursor, visible: rect.width > 0 && rect.height > 0, inline: style.display === "inline" };\n}\nfunction isElementVisible(element) {\n return computeBox(element).visible;\n}\nfunction isVisibleTextNode(node) {\n const range = node.ownerDocument.createRange();\n range.selectNode(node);\n const rect = range.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\nfunction elementSafeTagName(element) {\n const tagName = element.tagName;\n if (typeof tagName === "string") {\n const firstCharCode = tagName.charCodeAt(0);\n if (firstCharCode >= 97 && firstCharCode <= 122)\n return tagName.toUpperCase();\n return tagName;\n }\n if (element instanceof HTMLFormElement)\n return "FORM";\n return element.tagName.toUpperCase();\n}\nvar cacheStyle;\nvar cacheStyleBefore;\nvar cacheStyleAfter;\nvar cacheStyleVisibility;\nvar cachesCounter = 0;\nfunction beginDOMCaches() {\n ++cachesCounter;\n cacheStyle != null ? cacheStyle : cacheStyle = /* @__PURE__ */ new Map();\n cacheStyleBefore != null ? cacheStyleBefore : cacheStyleBefore = /* @__PURE__ */ new Map();\n cacheStyleAfter != null ? cacheStyleAfter : cacheStyleAfter = /* @__PURE__ */ new Map();\n cacheStyleVisibility != null ? cacheStyleVisibility : cacheStyleVisibility = /* @__PURE__ */ new Map();\n}\nfunction endDOMCaches() {\n if (!--cachesCounter) {\n cacheStyle = void 0;\n cacheStyleBefore = void 0;\n cacheStyleAfter = void 0;\n cacheStyleVisibility = void 0;\n }\n}\n\n// packages/injected/src/roleUtils.ts\nfunction hasExplicitAccessibleName(e) {\n return e.hasAttribute("aria-label") || e.hasAttribute("aria-labelledby");\n}\nvar kAncestorPreventingLandmark = "article:not([role]), aside:not([role]), main:not([role]), nav:not([role]), section:not([role]), [role=article], [role=complementary], [role=main], [role=navigation], [role=region]";\nvar kGlobalAriaAttributes = [\n ["aria-atomic", void 0],\n ["aria-busy", void 0],\n ["aria-controls", void 0],\n ["aria-current", void 0],\n ["aria-describedby", void 0],\n ["aria-details", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-disabled\', undefined],\n ["aria-dropeffect", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-errormessage\', undefined],\n ["aria-flowto", void 0],\n ["aria-grabbed", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-haspopup\', undefined],\n ["aria-hidden", void 0],\n // Global use deprecated in ARIA 1.2\n // [\'aria-invalid\', undefined],\n ["aria-keyshortcuts", void 0],\n ["aria-label", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-labelledby", ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]],\n ["aria-live", void 0],\n ["aria-owns", void 0],\n ["aria-relevant", void 0],\n ["aria-roledescription", ["generic"]]\n];\nfunction hasGlobalAriaAttribute(element, forRole) {\n return kGlobalAriaAttributes.some(([attr, prohibited]) => {\n return !(prohibited == null ? void 0 : prohibited.includes(forRole || "")) && element.hasAttribute(attr);\n });\n}\nfunction hasTabIndex(element) {\n return !Number.isNaN(Number(String(element.getAttribute("tabindex"))));\n}\nfunction isFocusable(element) {\n return !isNativelyDisabled(element) && (isNativelyFocusable(element) || hasTabIndex(element));\n}\nfunction isNativelyFocusable(element) {\n const tagName = elementSafeTagName(element);\n if (["BUTTON", "DETAILS", "SELECT", "TEXTAREA"].includes(tagName))\n return true;\n if (tagName === "A" || tagName === "AREA")\n return element.hasAttribute("href");\n if (tagName === "INPUT")\n return !element.hidden;\n return false;\n}\nvar kImplicitRoleByTagName = {\n "A": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "AREA": (e) => {\n return e.hasAttribute("href") ? "link" : null;\n },\n "ARTICLE": () => "article",\n "ASIDE": () => "complementary",\n "BLOCKQUOTE": () => "blockquote",\n "BUTTON": () => "button",\n "CAPTION": () => "caption",\n "CODE": () => "code",\n "DATALIST": () => "listbox",\n "DD": () => "definition",\n "DEL": () => "deletion",\n "DETAILS": () => "group",\n "DFN": () => "term",\n "DIALOG": () => "dialog",\n "DT": () => "term",\n "EM": () => "emphasis",\n "FIELDSET": () => "group",\n "FIGURE": () => "figure",\n "FOOTER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "contentinfo",\n "FORM": (e) => hasExplicitAccessibleName(e) ? "form" : null,\n "H1": () => "heading",\n "H2": () => "heading",\n "H3": () => "heading",\n "H4": () => "heading",\n "H5": () => "heading",\n "H6": () => "heading",\n "HEADER": (e) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : "banner",\n "HR": () => "separator",\n "HTML": () => "document",\n "IMG": (e) => e.getAttribute("alt") === "" && !e.getAttribute("title") && !hasGlobalAriaAttribute(e) && !hasTabIndex(e) ? "presentation" : "img",\n "INPUT": (e) => {\n const type = e.type.toLowerCase();\n if (["email", "search", "tel", "text", "url", ""].includes(type)) {\n const list = getIdRefs(e, e.getAttribute("list"))[0];\n if (list && elementSafeTagName(list) === "DATALIST")\n return "combobox";\n return type === "search" ? "searchbox" : "textbox";\n }\n if (type === "hidden")\n return null;\n if (type === "file")\n return "button";\n return inputTypeToRole[type] || "textbox";\n },\n "INS": () => "insertion",\n "LI": () => "listitem",\n "MAIN": () => "main",\n "MARK": () => "mark",\n "MATH": () => "math",\n "MENU": () => "list",\n "METER": () => "meter",\n "NAV": () => "navigation",\n "OL": () => "list",\n "OPTGROUP": () => "group",\n "OPTION": () => "option",\n "OUTPUT": () => "status",\n "P": () => "paragraph",\n "PROGRESS": () => "progressbar",\n "SEARCH": () => "search",\n "SECTION": (e) => hasExplicitAccessibleName(e) ? "region" : null,\n "SELECT": (e) => e.hasAttribute("multiple") || e.size > 1 ? "listbox" : "combobox",\n "STRONG": () => "strong",\n "SUB": () => "subscript",\n "SUP": () => "superscript",\n // For we default to Chrome behavior:\n // - Chrome reports \'img\'.\n // - Firefox reports \'diagram\' that is not in official ARIA spec yet.\n // - Safari reports \'no role\', but still computes accessible name.\n "SVG": () => "img",\n "TABLE": () => "table",\n "TBODY": () => "rowgroup",\n "TD": (e) => {\n const table = closestCrossShadow(e, "table");\n const role = table ? getExplicitAriaRole(table) : "";\n return role === "grid" || role === "treegrid" ? "gridcell" : "cell";\n },\n "TEXTAREA": () => "textbox",\n "TFOOT": () => "rowgroup",\n "TH": (e) => {\n const scope = e.getAttribute("scope");\n if (scope === "col" || scope === "colgroup")\n return "columnheader";\n if (scope === "row" || scope === "rowgroup")\n return "rowheader";\n const nextSibling = e.nextElementSibling;\n const prevSibling = e.previousElementSibling;\n const row = !!e.parentElement && elementSafeTagName(e.parentElement) === "TR" ? e.parentElement : void 0;\n if (!nextSibling && !prevSibling) {\n if (row) {\n const table = closestCrossShadow(row, "table");\n if (table && table.rows.length <= 1)\n return null;\n }\n return "columnheader";\n }\n if (isHeaderCell(nextSibling) && isHeaderCell(prevSibling))\n return "columnheader";\n if (isNonEmptyDataCell(nextSibling) || isNonEmptyDataCell(prevSibling))\n return "rowheader";\n return "columnheader";\n },\n "THEAD": () => "rowgroup",\n "TIME": () => "time",\n "TR": () => "row",\n "UL": () => "list"\n};\nfunction isHeaderCell(element) {\n return !!element && elementSafeTagName(element) === "TH";\n}\nfunction isNonEmptyDataCell(element) {\n var _a;\n if (!element || elementSafeTagName(element) !== "TD")\n return false;\n return !!(((_a = element.textContent) == null ? void 0 : _a.trim()) || element.children.length > 0);\n}\nvar kPresentationInheritanceParents = {\n "DD": ["DL", "DIV"],\n "DIV": ["DL"],\n "DT": ["DL", "DIV"],\n "LI": ["OL", "UL"],\n "TBODY": ["TABLE"],\n "TD": ["TR"],\n "TFOOT": ["TABLE"],\n "TH": ["TR"],\n "THEAD": ["TABLE"],\n "TR": ["THEAD", "TBODY", "TFOOT", "TABLE"]\n};\nfunction getImplicitAriaRole(element) {\n var _a;\n const implicitRole = ((_a = kImplicitRoleByTagName[elementSafeTagName(element)]) == null ? void 0 : _a.call(kImplicitRoleByTagName, element)) || "";\n if (!implicitRole)\n return null;\n let ancestor = element;\n while (ancestor) {\n const parent = parentElementOrShadowHost(ancestor);\n const parents = kPresentationInheritanceParents[elementSafeTagName(ancestor)];\n if (!parents || !parent || !parents.includes(elementSafeTagName(parent)))\n break;\n const parentExplicitRole = getExplicitAriaRole(parent);\n if ((parentExplicitRole === "none" || parentExplicitRole === "presentation") && !hasPresentationConflictResolution(parent, parentExplicitRole))\n return parentExplicitRole;\n ancestor = parent;\n }\n return implicitRole;\n}\nvar validRoles = [\n "alert",\n "alertdialog",\n "application",\n "article",\n "banner",\n "blockquote",\n "button",\n "caption",\n "cell",\n "checkbox",\n "code",\n "columnheader",\n "combobox",\n "complementary",\n "contentinfo",\n "definition",\n "deletion",\n "dialog",\n "directory",\n "document",\n "emphasis",\n "feed",\n "figure",\n "form",\n "generic",\n "grid",\n "gridcell",\n "group",\n "heading",\n "img",\n "insertion",\n "link",\n "list",\n "listbox",\n "listitem",\n "log",\n "main",\n "mark",\n "marquee",\n "math",\n "meter",\n "menu",\n "menubar",\n "menuitem",\n "menuitemcheckbox",\n "menuitemradio",\n "navigation",\n "none",\n "note",\n "option",\n "paragraph",\n "presentation",\n "progressbar",\n "radio",\n "radiogroup",\n "region",\n "row",\n "rowgroup",\n "rowheader",\n "scrollbar",\n "search",\n "searchbox",\n "separator",\n "slider",\n "spinbutton",\n "status",\n "strong",\n "subscript",\n "superscript",\n "switch",\n "tab",\n "table",\n "tablist",\n "tabpanel",\n "term",\n "textbox",\n "time",\n "timer",\n "toolbar",\n "tooltip",\n "tree",\n "treegrid",\n "treeitem"\n];\nfunction getExplicitAriaRole(element) {\n const roles = (element.getAttribute("role") || "").split(" ").map((role) => role.trim());\n return roles.find((role) => validRoles.includes(role)) || null;\n}\nfunction hasPresentationConflictResolution(element, role) {\n return hasGlobalAriaAttribute(element, role) || isFocusable(element);\n}\nfunction getAriaRole(element) {\n const cached = cacheAriaRole == null ? void 0 : cacheAriaRole.get(element);\n if (cached !== void 0)\n return cached;\n const role = computeAriaRole(element);\n cacheAriaRole == null ? void 0 : cacheAriaRole.set(element, role);\n return role;\n}\nfunction computeAriaRole(element) {\n const explicitRole = getExplicitAriaRole(element);\n if (!explicitRole)\n return getImplicitAriaRole(element);\n if (explicitRole === "none" || explicitRole === "presentation") {\n const implicitRole = getImplicitAriaRole(element);\n if (hasPresentationConflictResolution(element, implicitRole))\n return implicitRole;\n }\n return explicitRole;\n}\nfunction getAriaBoolean(attr) {\n return attr === null ? void 0 : attr.toLowerCase() === "true";\n}\nfunction isElementIgnoredForAria(element) {\n return ["STYLE", "SCRIPT", "NOSCRIPT", "TEMPLATE"].includes(elementSafeTagName(element));\n}\nfunction isElementHiddenForAria(element) {\n if (isElementIgnoredForAria(element))\n return true;\n const style = getElementComputedStyle(element);\n const isSlot = element.nodeName === "SLOT";\n if ((style == null ? void 0 : style.display) === "contents" && !isSlot) {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 && !isElementHiddenForAria(child))\n return false;\n if (child.nodeType === 3 && isVisibleTextNode(child))\n return false;\n }\n return true;\n }\n const isOptionInsideSelect = element.nodeName === "OPTION" && !!element.closest("select");\n if (!isOptionInsideSelect && !isSlot && !isElementStyleVisibilityVisible(element, style))\n return true;\n return belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element);\n}\nfunction belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element) {\n let hidden = cacheIsHidden == null ? void 0 : cacheIsHidden.get(element);\n if (hidden === void 0) {\n hidden = false;\n if (element.parentElement && element.parentElement.shadowRoot && !element.assignedSlot)\n hidden = true;\n if (!hidden) {\n const style = getElementComputedStyle(element);\n hidden = !style || style.display === "none" || getAriaBoolean(element.getAttribute("aria-hidden")) === true;\n }\n if (!hidden) {\n const parent = parentElementOrShadowHost(element);\n if (parent)\n hidden = belongsToDisplayNoneOrAriaHiddenOrNonSlotted(parent);\n }\n cacheIsHidden == null ? void 0 : cacheIsHidden.set(element, hidden);\n }\n return hidden;\n}\nfunction getIdRefs(element, ref) {\n if (!ref)\n return [];\n const root = enclosingShadowRootOrDocument(element);\n if (!root)\n return [];\n try {\n const ids = ref.split(" ").filter((id) => !!id);\n const result = [];\n for (const id of ids) {\n const firstElement = root.querySelector("#" + CSS.escape(id));\n if (firstElement && !result.includes(firstElement))\n result.push(firstElement);\n }\n return result;\n } catch (e) {\n return [];\n }\n}\nfunction trimFlatString(s) {\n return s.trim();\n}\nfunction asFlatString(s) {\n return s.split("\\xA0").map((chunk) => chunk.replace(/\\r\\n/g, "\\n").replace(/[\\u200b\\u00ad]/g, "").replace(/\\s\\s*/g, " ")).join("\\xA0").trim();\n}\nfunction queryInAriaOwned(element, selector) {\n const result = [...element.querySelectorAll(selector)];\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns"))) {\n if (owned.matches(selector))\n result.push(owned);\n result.push(...owned.querySelectorAll(selector));\n }\n return result;\n}\nfunction getCSSContent(element, pseudo) {\n const cache = pseudo === "::before" ? cachePseudoContentBefore : pseudo === "::after" ? cachePseudoContentAfter : cachePseudoContent;\n if (cache == null ? void 0 : cache.has(element))\n return cache == null ? void 0 : cache.get(element);\n const style = getElementComputedStyle(element, pseudo);\n let content;\n if (style) {\n const contentValue = style.content;\n if (contentValue && contentValue !== "none" && contentValue !== "normal") {\n if (style.display !== "none" && style.visibility !== "hidden") {\n content = parseCSSContentPropertyAsString(element, contentValue, !!pseudo);\n }\n }\n }\n if (pseudo && content !== void 0) {\n const display = (style == null ? void 0 : style.display) || "inline";\n if (display !== "inline")\n content = " " + content + " ";\n }\n if (cache)\n cache.set(element, content);\n return content;\n}\nfunction parseCSSContentPropertyAsString(element, content, isPseudo) {\n if (!content || content === "none" || content === "normal") {\n return;\n }\n try {\n let tokens = tokenize(content).filter((token) => !(token instanceof WhitespaceToken));\n const delimIndex = tokens.findIndex((token) => token instanceof DelimToken && token.value === "/");\n if (delimIndex !== -1) {\n tokens = tokens.slice(delimIndex + 1);\n } else if (!isPseudo) {\n return;\n }\n const accumulated = [];\n let index = 0;\n while (index < tokens.length) {\n if (tokens[index] instanceof StringToken) {\n accumulated.push(tokens[index].value);\n index++;\n } else if (index + 2 < tokens.length && tokens[index] instanceof FunctionToken && tokens[index].value === "attr" && tokens[index + 1] instanceof IdentToken && tokens[index + 2] instanceof CloseParenToken) {\n const attrName = tokens[index + 1].value;\n accumulated.push(element.getAttribute(attrName) || "");\n index += 3;\n } else {\n return;\n }\n }\n return accumulated.join("");\n } catch {\n }\n}\nfunction getAriaLabelledByElements(element) {\n const ref = element.getAttribute("aria-labelledby");\n if (ref === null)\n return null;\n const refs = getIdRefs(element, ref);\n return refs.length ? refs : null;\n}\nfunction allowsNameFromContent(role, targetDescendant) {\n const alwaysAllowsNameFromContent = ["button", "cell", "checkbox", "columnheader", "gridcell", "heading", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "row", "rowheader", "switch", "tab", "tooltip", "treeitem"].includes(role);\n const descendantAllowsNameFromContent = targetDescendant && ["", "caption", "code", "contentinfo", "definition", "deletion", "emphasis", "insertion", "list", "listitem", "mark", "none", "paragraph", "presentation", "region", "row", "rowgroup", "section", "strong", "subscript", "superscript", "table", "term", "time"].includes(role);\n return alwaysAllowsNameFromContent || descendantAllowsNameFromContent;\n}\nfunction computeAccessibleNameComposite(element, includeHidden, collectElements) {\n const elementProhibitsNaming = ["caption", "code", "definition", "deletion", "emphasis", "generic", "insertion", "mark", "paragraph", "presentation", "strong", "subscript", "suggestion", "superscript", "term", "time"].includes(getAriaRole(element) || "");\n if (elementProhibitsNaming)\n return emptyCompositeString();\n const result = getTextAlternativeInternal(element, {\n includeHidden,\n collectElements,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInTargetElement: "self"\n });\n return { text: asFlatString(result.text), elements: result.elements };\n}\nfunction getElementAccessibleName(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName;\n let accessibleName = cache == null ? void 0 : cache.get(element);\n if (accessibleName === void 0) {\n accessibleName = computeAccessibleNameComposite(\n element,\n includeHidden,\n true\n /* collectElements */\n );\n cache == null ? void 0 : cache.set(element, accessibleName);\n }\n return accessibleName;\n}\nfunction getElementAccessibleNameText(element, includeHidden) {\n var _a;\n const composite = (_a = includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName) == null ? void 0 : _a.get(element);\n if (composite !== void 0)\n return composite.text;\n const cache = includeHidden ? cacheAccessibleNameTextHidden : cacheAccessibleNameText;\n let text = cache == null ? void 0 : cache.get(element);\n if (text === void 0) {\n text = computeAccessibleNameComposite(\n element,\n includeHidden,\n false\n /* collectElements */\n ).text;\n cache == null ? void 0 : cache.set(element, text);\n }\n return text;\n}\nfunction getElementAccessibleDescription(element, includeHidden) {\n const cache = includeHidden ? cacheAccessibleDescriptionHidden : cacheAccessibleDescription;\n let accessibleDescription = cache == null ? void 0 : cache.get(element);\n if (accessibleDescription === void 0) {\n accessibleDescription = "";\n if (element.hasAttribute("aria-describedby")) {\n const describedBy = getIdRefs(element, element.getAttribute("aria-describedby"));\n accessibleDescription = asFlatString(describedBy.map((ref) => getTextAlternativeInternal(ref, {\n includeHidden,\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: ref, hidden: isElementHiddenForAria(ref) }\n }).text).join(" "));\n } else if (element.hasAttribute("aria-description")) {\n accessibleDescription = asFlatString(element.getAttribute("aria-description") || "");\n } else {\n accessibleDescription = asFlatString(element.getAttribute("title") || "");\n }\n cache == null ? void 0 : cache.set(element, accessibleDescription);\n }\n return accessibleDescription;\n}\nvar kAriaInvalidRoles = [\n "application",\n "checkbox",\n "columnheader",\n "combobox",\n "gridcell",\n "listbox",\n "radiogroup",\n "rowheader",\n "searchbox",\n "slider",\n "spinbutton",\n "switch",\n "textbox",\n "tree"\n];\nfunction getAriaInvalid(element) {\n const ariaInvalid = element.getAttribute("aria-invalid");\n if (!ariaInvalid || ariaInvalid.trim() === "" || ariaInvalid.toLocaleLowerCase() === "false")\n return "false";\n if (ariaInvalid === "true" || ariaInvalid === "grammar" || ariaInvalid === "spelling")\n return ariaInvalid;\n return "true";\n}\nfunction getValidityInvalid(element) {\n if ("validity" in element) {\n const validity = element.validity;\n return (validity == null ? void 0 : validity.valid) === false;\n }\n return false;\n}\nfunction getElementAccessibleErrorMessage(element) {\n const cache = cacheAccessibleErrorMessage;\n let accessibleErrorMessage = cacheAccessibleErrorMessage == null ? void 0 : cacheAccessibleErrorMessage.get(element);\n if (accessibleErrorMessage === void 0) {\n accessibleErrorMessage = "";\n const isAriaInvalid = getAriaInvalid(element) !== "false";\n const isValidityInvalid = getValidityInvalid(element);\n if (isAriaInvalid || isValidityInvalid) {\n const errorMessageId = element.getAttribute("aria-errormessage");\n const errorMessages = getIdRefs(element, errorMessageId);\n const parts = errorMessages.map((errorMessage) => asFlatString(\n getTextAlternativeInternal(errorMessage, {\n visitedElements: /* @__PURE__ */ new Set(),\n embeddedInDescribedBy: { element: errorMessage, hidden: isElementHiddenForAria(errorMessage) }\n }).text\n ));\n accessibleErrorMessage = parts.join(" ").trim();\n }\n cache == null ? void 0 : cache.set(element, accessibleErrorMessage);\n }\n return accessibleErrorMessage;\n}\nfunction getTextAlternativeInternal(element, options) {\n var _a, _b, _c, _d, _e;\n if (options.visitedElements.has(element))\n return emptyCompositeString();\n const childOptions = {\n ...options,\n embeddedInTargetElement: options.embeddedInTargetElement === "self" ? "descendant" : options.embeddedInTargetElement\n };\n if (!options.includeHidden) {\n const isEmbeddedInHiddenReferenceTraversal = !!((_a = options.embeddedInLabelledBy) == null ? void 0 : _a.hidden) || !!((_b = options.embeddedInDescribedBy) == null ? void 0 : _b.hidden) || !!((_c = options.embeddedInNativeTextAlternative) == null ? void 0 : _c.hidden) || !!((_d = options.embeddedInLabel) == null ? void 0 : _d.hidden);\n if (isElementIgnoredForAria(element) || !isEmbeddedInHiddenReferenceTraversal && isElementHiddenForAria(element)) {\n options.visitedElements.add(element);\n return emptyCompositeString();\n }\n }\n const labelledBy = getAriaLabelledByElements(element);\n if (!options.embeddedInLabelledBy) {\n const accessibleName = joinCompositeString((labelledBy || []).map((ref) => getTextAlternativeInternal(ref, {\n ...options,\n embeddedInLabelledBy: { element: ref, hidden: isElementHiddenForAria(ref) },\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0,\n embeddedInLabel: void 0,\n embeddedInNativeTextAlternative: void 0\n })), " ", options.collectElements);\n if (accessibleName.text)\n return accessibleName;\n }\n const role = getAriaRole(element) || "";\n const tagName = elementSafeTagName(element);\n if (!!options.embeddedInLabel || !!options.embeddedInLabelledBy || options.embeddedInTargetElement === "descendant") {\n const isOwnLabel = [...element.labels || []].includes(element);\n const isOwnLabelledBy = (labelledBy || []).includes(element);\n if (!isOwnLabel && !isOwnLabelledBy) {\n if (role === "textbox") {\n options.visitedElements.add(element);\n if (tagName === "INPUT" || tagName === "TEXTAREA")\n return compositeString(element.value, element, options.collectElements);\n return compositeString(element.textContent, element, options.collectElements);\n }\n if (["combobox", "listbox"].includes(role)) {\n options.visitedElements.add(element);\n let selectedOptions;\n if (tagName === "SELECT") {\n selectedOptions = [...element.selectedOptions];\n if (!selectedOptions.length && element.options.length)\n selectedOptions.push(element.options[0]);\n } else {\n const listbox = role === "combobox" ? queryInAriaOwned(element, "*").find((e) => getAriaRole(e) === "listbox") : element;\n selectedOptions = listbox ? queryInAriaOwned(listbox, \'[aria-selected="true"]\').filter((e) => getAriaRole(e) === "option") : [];\n }\n if (!selectedOptions.length && tagName === "INPUT") {\n return compositeString(element.value, element, options.collectElements);\n }\n return joinCompositeString(selectedOptions.map((option) => getTextAlternativeInternal(option, childOptions)), " ", options.collectElements);\n }\n if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) {\n options.visitedElements.add(element);\n if (element.hasAttribute("aria-valuetext"))\n return compositeString(element.getAttribute("aria-valuetext"), element, options.collectElements);\n if (element.hasAttribute("aria-valuenow"))\n return compositeString(element.getAttribute("aria-valuenow"), element, options.collectElements);\n return compositeString(element.getAttribute("value"), element, options.collectElements);\n }\n if (["menu"].includes(role)) {\n options.visitedElements.add(element);\n return emptyCompositeString();\n }\n }\n }\n const ariaLabel = element.getAttribute("aria-label") || "";\n if (trimFlatString(ariaLabel)) {\n options.visitedElements.add(element);\n return compositeString(ariaLabel, element, options.collectElements);\n }\n if (!["presentation", "none"].includes(role)) {\n if (tagName === "INPUT" && ["button", "submit", "reset"].includes(element.type)) {\n options.visitedElements.add(element);\n const value = element.value || "";\n if (trimFlatString(value))\n return compositeString(value, element, options.collectElements);\n if (element.type === "submit")\n return compositeString("Submit", element, options.collectElements);\n if (element.type === "reset")\n return compositeString("Reset", element, options.collectElements);\n const title = element.getAttribute("title") || "";\n return compositeString(title, element, options.collectElements);\n }\n if (tagName === "INPUT" && element.type === "file") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return compositeString("Choose File", element, options.collectElements);\n }\n if (tagName === "INPUT" && element.type === "image") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return compositeString(title, element, options.collectElements);\n return compositeString("Submit", element, options.collectElements);\n }\n if (!labelledBy && tagName === "BUTTON") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n }\n if (!labelledBy && tagName === "OUTPUT") {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return compositeString(element.getAttribute("title") || "", element, options.collectElements);\n }\n if (!labelledBy && (tagName === "TEXTAREA" || tagName === "SELECT" || tagName === "INPUT" || tagName === "METER" || tagName === "PROGRESS")) {\n options.visitedElements.add(element);\n const labels = element.labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const usePlaceholder = tagName === "INPUT" && ["text", "password", "number", "search", "tel", "email", "url"].includes(element.type) || tagName === "TEXTAREA";\n const placeholder = element.getAttribute("placeholder") || "";\n const title = element.getAttribute("title") || "";\n if (!usePlaceholder || title)\n return compositeString(title, element, options.collectElements);\n return compositeString(placeholder, element, options.collectElements);\n }\n if (!labelledBy && tagName === "FIELDSET") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "LEGEND") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return compositeString(title, element, options.collectElements);\n }\n if (!labelledBy && tagName === "FIGURE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "FIGCAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const title = element.getAttribute("title") || "";\n return compositeString(title, element, options.collectElements);\n }\n if (tagName === "IMG") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute("title") || "";\n return compositeString(title, element, options.collectElements);\n }\n if (tagName === "TABLE") {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "CAPTION") {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n const summary = element.getAttribute("summary") || "";\n if (summary)\n return compositeString(summary, element, options.collectElements);\n }\n if (tagName === "AREA") {\n options.visitedElements.add(element);\n const alt = element.getAttribute("alt") || "";\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute("title") || "";\n return compositeString(title, element, options.collectElements);\n }\n if (tagName === "SVG" || element.ownerSVGElement) {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === "TITLE" && child.ownerSVGElement) {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInLabelledBy: { element: child, hidden: isElementHiddenForAria(child) }\n });\n }\n }\n }\n if (element.ownerSVGElement && tagName === "A") {\n const title = element.getAttribute("xlink:title") || "";\n if (trimFlatString(title)) {\n options.visitedElements.add(element);\n return compositeString(title, element, options.collectElements);\n }\n }\n }\n const shouldNameFromContentForSummary = tagName === "SUMMARY" && !["presentation", "none"].includes(role);\n if (allowsNameFromContent(role, options.embeddedInTargetElement === "descendant") || shouldNameFromContentForSummary || !!options.embeddedInLabelledBy || !!options.embeddedInDescribedBy || !!options.embeddedInLabel || !!options.embeddedInNativeTextAlternative) {\n options.visitedElements.add(element);\n const accessibleName = innerAccumulatedElementText(element, childOptions);\n const maybeTrimmedAccessibleName = options.embeddedInTargetElement === "self" ? trimFlatString(accessibleName.text) : accessibleName.text;\n if (maybeTrimmedAccessibleName) {\n (_e = accessibleName.elements) == null ? void 0 : _e.add(element);\n return accessibleName;\n }\n }\n if (!["presentation", "none"].includes(role) || tagName === "IFRAME" || tagName === "FRAME") {\n options.visitedElements.add(element);\n const title = element.getAttribute("title") || "";\n if (trimFlatString(title))\n return compositeString(title, element, options.collectElements);\n }\n options.visitedElements.add(element);\n return emptyCompositeString();\n}\nfunction innerAccumulatedElementText(element, options) {\n const tokens = [];\n const elements = options.collectElements ? /* @__PURE__ */ new Set() : void 0;\n const visit = (node, skipSlotted) => {\n var _a;\n if (skipSlotted && node.assignedSlot)\n return;\n if (node.nodeType === 1) {\n const display = ((_a = getElementComputedStyle(node)) == null ? void 0 : _a.display) || "inline";\n const childComposite = getTextAlternativeInternal(node, options);\n let token = childComposite.text;\n for (const contributor of childComposite.elements || [])\n elements == null ? void 0 : elements.add(contributor);\n if (display !== "inline" || node.nodeName === "BR")\n token = " " + token + " ";\n tokens.push(token);\n } else if (node.nodeType === 3) {\n tokens.push(node.textContent || "");\n }\n };\n tokens.push(getCSSContent(element, "::before") || "");\n const content = getCSSContent(element);\n if (content !== void 0) {\n tokens.push(content);\n } else {\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(child, false);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling)\n visit(child, true);\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(child, true);\n }\n for (const owned of getIdRefs(element, element.getAttribute("aria-owns")))\n visit(owned, true);\n }\n }\n tokens.push(getCSSContent(element, "::after") || "");\n return { text: tokens.join(""), elements };\n}\nvar kAriaSelectedRoles = ["gridcell", "option", "row", "tab", "rowheader", "columnheader", "treeitem"];\nfunction getAriaSelected(element) {\n if (elementSafeTagName(element) === "OPTION")\n return element.selected;\n if (kAriaSelectedRoles.includes(getAriaRole(element) || ""))\n return getAriaBoolean(element.getAttribute("aria-selected")) === true;\n return false;\n}\nvar kAriaCheckedRoles = ["checkbox", "menuitemcheckbox", "option", "radio", "switch", "menuitemradio", "treeitem"];\nfunction getAriaChecked(element) {\n const result = getChecked(element, true);\n return result === "error" ? false : result;\n}\nfunction getCheckedAllowMixed(element) {\n return getChecked(element, true);\n}\nfunction getCheckedWithoutMixed(element) {\n const result = getChecked(element, false);\n return result;\n}\nfunction getChecked(element, allowMixed) {\n const tagName = elementSafeTagName(element);\n if (allowMixed && tagName === "INPUT" && element.indeterminate)\n return "mixed";\n if (tagName === "INPUT" && ["checkbox", "radio"].includes(element.type))\n return element.checked;\n if (kAriaCheckedRoles.includes(getAriaRole(element) || "")) {\n const checked = element.getAttribute("aria-checked");\n if (checked === "true")\n return true;\n if (allowMixed && checked === "mixed")\n return "mixed";\n return false;\n }\n return "error";\n}\nvar kAriaReadonlyRoles = ["checkbox", "combobox", "grid", "gridcell", "listbox", "radiogroup", "slider", "spinbutton", "textbox", "columnheader", "rowheader", "searchbox", "switch", "treegrid"];\nfunction getReadonly(element) {\n const tagName = elementSafeTagName(element);\n if (["INPUT", "TEXTAREA", "SELECT"].includes(tagName))\n return element.hasAttribute("readonly");\n if (kAriaReadonlyRoles.includes(getAriaRole(element) || ""))\n return element.getAttribute("aria-readonly") === "true";\n if (element.isContentEditable)\n return false;\n return "error";\n}\nvar kAriaPressedRoles = ["button"];\nfunction getAriaPressed(element) {\n if (kAriaPressedRoles.includes(getAriaRole(element) || "")) {\n const pressed = element.getAttribute("aria-pressed");\n if (pressed === "true")\n return true;\n if (pressed === "mixed")\n return "mixed";\n }\n return false;\n}\nvar kAriaExpandedRoles = ["application", "button", "checkbox", "combobox", "gridcell", "link", "listbox", "menuitem", "row", "rowheader", "tab", "treeitem", "columnheader", "menuitemcheckbox", "menuitemradio", "rowheader", "switch"];\nfunction getAriaExpanded(element) {\n if (elementSafeTagName(element) === "DETAILS")\n return element.open;\n if (kAriaExpandedRoles.includes(getAriaRole(element) || "")) {\n const expanded = element.getAttribute("aria-expanded");\n if (expanded === null)\n return void 0;\n if (expanded === "true")\n return true;\n return false;\n }\n return void 0;\n}\nvar kAriaLevelRoles = ["heading", "listitem", "row", "treeitem"];\nfunction getAriaLevel(element) {\n const native = { "H1": 1, "H2": 2, "H3": 3, "H4": 4, "H5": 5, "H6": 6 }[elementSafeTagName(element)];\n if (native)\n return native;\n if (kAriaLevelRoles.includes(getAriaRole(element) || "")) {\n const attr = element.getAttribute("aria-level");\n const value = attr === null ? Number.NaN : Number(attr);\n if (Number.isInteger(value) && value >= 1)\n return value;\n }\n return 0;\n}\nvar kAriaDisabledRoles = ["application", "button", "composite", "gridcell", "group", "input", "link", "menuitem", "scrollbar", "separator", "tab", "checkbox", "columnheader", "combobox", "grid", "listbox", "menu", "menubar", "menuitemcheckbox", "menuitemradio", "option", "radio", "radiogroup", "row", "rowheader", "searchbox", "select", "slider", "spinbutton", "switch", "tablist", "textbox", "toolbar", "tree", "treegrid", "treeitem"];\nfunction getAriaDisabled(element) {\n return isNativelyDisabled(element) || hasExplicitAriaDisabled(element);\n}\nfunction isNativelyDisabled(element) {\n const isNativeFormControl = ["BUTTON", "INPUT", "SELECT", "TEXTAREA", "OPTION", "OPTGROUP"].includes(elementSafeTagName(element));\n return isNativeFormControl && (element.hasAttribute("disabled") || belongsToDisabledOptGroup(element) || belongsToDisabledFieldSet(element));\n}\nfunction belongsToDisabledOptGroup(element) {\n return elementSafeTagName(element) === "OPTION" && !!element.closest("OPTGROUP[DISABLED]");\n}\nfunction belongsToDisabledFieldSet(element) {\n const fieldSetElement = element == null ? void 0 : element.closest("FIELDSET[DISABLED]");\n if (!fieldSetElement)\n return false;\n const legendElement = fieldSetElement.querySelector(":scope > LEGEND");\n return !legendElement || !legendElement.contains(element);\n}\nfunction hasExplicitAriaDisabled(element) {\n if (!kAriaDisabledRoles.includes(getAriaRole(element) || ""))\n return false;\n return hasAriaDisabledInChain(element);\n}\nfunction hasAriaDisabledInChain(element) {\n let result = cacheAriaDisabled == null ? void 0 : cacheAriaDisabled.get(element);\n if (result === void 0) {\n const attribute = (element.getAttribute("aria-disabled") || "").toLowerCase();\n if (attribute === "true") {\n result = true;\n } else if (attribute === "false") {\n result = false;\n } else {\n const parent = parentElementOrShadowHost(element);\n result = parent ? hasAriaDisabledInChain(parent) : false;\n }\n cacheAriaDisabled == null ? void 0 : cacheAriaDisabled.set(element, result);\n }\n return result;\n}\nfunction getAccessibleNameFromAssociatedLabels(labels, options) {\n return joinCompositeString([...labels].map((label) => getTextAlternativeInternal(label, {\n ...options,\n embeddedInLabel: { element: label, hidden: isElementHiddenForAria(label) },\n embeddedInNativeTextAlternative: void 0,\n embeddedInLabelledBy: void 0,\n embeddedInDescribedBy: void 0,\n embeddedInTargetElement: void 0\n })).filter((accessibleName) => !!accessibleName.text), " ", options.collectElements);\n}\nfunction receivesPointerEvents(element) {\n const cache = cachePointerEvents;\n let e = element;\n let result;\n const parents = [];\n for (; e; e = parentElementOrShadowHost(e)) {\n const cached = cache.get(e);\n if (cached !== void 0) {\n result = cached;\n break;\n }\n parents.push(e);\n const style = getElementComputedStyle(e);\n if (!style) {\n result = true;\n break;\n }\n const value = style.pointerEvents;\n if (value) {\n result = value !== "none";\n break;\n }\n }\n if (result === void 0)\n result = true;\n for (const parent of parents)\n cache.set(parent, result);\n return result;\n}\nvar cacheAccessibleName;\nvar cacheAccessibleNameHidden;\nvar cacheAccessibleNameText;\nvar cacheAccessibleNameTextHidden;\nvar cacheAccessibleDescription;\nvar cacheAccessibleDescriptionHidden;\nvar cacheAccessibleErrorMessage;\nvar cacheIsHidden;\nvar cachePseudoContent;\nvar cachePseudoContentBefore;\nvar cachePseudoContentAfter;\nvar cachePointerEvents;\nvar cacheAriaRole;\nvar cacheAriaDisabled;\nvar cachesCounter2 = 0;\nfunction beginAriaCaches() {\n beginDOMCaches();\n ++cachesCounter2;\n cacheAriaRole != null ? cacheAriaRole : cacheAriaRole = /* @__PURE__ */ new Map();\n cacheAriaDisabled != null ? cacheAriaDisabled : cacheAriaDisabled = /* @__PURE__ */ new Map();\n cacheAccessibleName != null ? cacheAccessibleName : cacheAccessibleName = /* @__PURE__ */ new Map();\n cacheAccessibleNameHidden != null ? cacheAccessibleNameHidden : cacheAccessibleNameHidden = /* @__PURE__ */ new Map();\n cacheAccessibleNameText != null ? cacheAccessibleNameText : cacheAccessibleNameText = /* @__PURE__ */ new Map();\n cacheAccessibleNameTextHidden != null ? cacheAccessibleNameTextHidden : cacheAccessibleNameTextHidden = /* @__PURE__ */ new Map();\n cacheAccessibleDescription != null ? cacheAccessibleDescription : cacheAccessibleDescription = /* @__PURE__ */ new Map();\n cacheAccessibleDescriptionHidden != null ? cacheAccessibleDescriptionHidden : cacheAccessibleDescriptionHidden = /* @__PURE__ */ new Map();\n cacheAccessibleErrorMessage != null ? cacheAccessibleErrorMessage : cacheAccessibleErrorMessage = /* @__PURE__ */ new Map();\n cacheIsHidden != null ? cacheIsHidden : cacheIsHidden = /* @__PURE__ */ new Map();\n cachePseudoContent != null ? cachePseudoContent : cachePseudoContent = /* @__PURE__ */ new Map();\n cachePseudoContentBefore != null ? cachePseudoContentBefore : cachePseudoContentBefore = /* @__PURE__ */ new Map();\n cachePseudoContentAfter != null ? cachePseudoContentAfter : cachePseudoContentAfter = /* @__PURE__ */ new Map();\n cachePointerEvents != null ? cachePointerEvents : cachePointerEvents = /* @__PURE__ */ new Map();\n}\nfunction endAriaCaches() {\n if (!--cachesCounter2) {\n cacheAccessibleName = void 0;\n cacheAccessibleNameHidden = void 0;\n cacheAccessibleNameText = void 0;\n cacheAccessibleNameTextHidden = void 0;\n cacheAccessibleDescription = void 0;\n cacheAccessibleDescriptionHidden = void 0;\n cacheAccessibleErrorMessage = void 0;\n cacheIsHidden = void 0;\n cachePseudoContent = void 0;\n cachePseudoContentBefore = void 0;\n cachePseudoContentAfter = void 0;\n cachePointerEvents = void 0;\n cacheAriaRole = void 0;\n cacheAriaDisabled = void 0;\n }\n endDOMCaches();\n}\nvar inputTypeToRole = {\n "button": "button",\n "checkbox": "checkbox",\n "image": "button",\n "number": "spinbutton",\n "radio": "radio",\n "range": "slider",\n "reset": "button",\n "submit": "button"\n};\nfunction emptyCompositeString() {\n return { text: "" };\n}\nfunction compositeString(text, element, collectElements) {\n const elements = text && collectElements ? /* @__PURE__ */ new Set([element]) : void 0;\n return { text: text || "", elements };\n}\nfunction joinCompositeString(parts, separator, collectElements) {\n let elements;\n if (collectElements) {\n elements = /* @__PURE__ */ new Set();\n for (const part of parts) {\n for (const element of part.elements || [])\n elements.add(element);\n }\n }\n return { text: parts.map((part) => part.text).join(separator), elements };\n}\n\n// packages/injected/src/ariaSnapshot.ts\nvar lastRef = 0;\nfunction toInternalOptions(options) {\n const renderBoxes = options.boxes;\n if (options.mode === "ai") {\n return {\n visibility: "ariaOrVisible",\n refs: "interactable",\n refPrefix: options.refPrefix,\n includeGenericRole: true,\n renderActive: !options.doNotRenderActive,\n renderCursorPointer: true,\n renderBoxes\n };\n }\n if (options.mode === "autoexpect") {\n return { visibility: "ariaAndVisible", refs: "none", renderBoxes };\n }\n if (options.mode === "codegen") {\n return { visibility: "aria", refs: "none", renderStringsAsRegex: true, renderBoxes };\n }\n return { visibility: "aria", refs: "none", renderBoxes };\n}\nfunction generateAriaTree(rootElement, publicOptions) {\n const options = toInternalOptions(publicOptions);\n const visited = /* @__PURE__ */ new Set();\n const nameSourceElements = /* @__PURE__ */ new Map();\n const snapshot = {\n root: { role: "fragment", name: "", children: [], props: {}, box: computeBox(rootElement), receivesPointerEvents: true },\n info: /* @__PURE__ */ new Map(),\n refs: /* @__PURE__ */ new Map(),\n iframeRefs: []\n };\n setAriaNodeElement(snapshot.root, rootElement);\n const visit = (ariaNode, node, parentElementVisible) => {\n if (visited.has(node))\n return;\n visited.add(node);\n if (node.nodeType === Node.TEXT_NODE && node.nodeValue) {\n if (!parentElementVisible)\n return;\n const text = node.nodeValue;\n if (ariaNode.role !== "textbox" && text)\n ariaNode.children.push(node.nodeValue || "");\n return;\n }\n if (node.nodeType !== Node.ELEMENT_NODE)\n return;\n const element = node;\n const isElementVisibleForAria = !isElementHiddenForAria(element);\n let visible = isElementVisibleForAria;\n if (options.visibility === "ariaOrVisible")\n visible = isElementVisibleForAria || isElementVisible(element);\n if (options.visibility === "ariaAndVisible")\n visible = isElementVisibleForAria && isElementVisible(element);\n if (options.visibility === "aria" && !visible)\n return;\n const ariaChildren = [];\n if (element.hasAttribute("aria-owns")) {\n const ids = element.getAttribute("aria-owns").split(/\\s+/);\n for (const id of ids) {\n const ownedElement = rootElement.ownerDocument.getElementById(id);\n if (ownedElement)\n ariaChildren.push(ownedElement);\n }\n }\n const childAriaNode = visible ? toAriaNode(element, options, nameSourceElements) : null;\n let elementInfo;\n if (childAriaNode) {\n if (childAriaNode.ref) {\n elementInfo = { element, nameFromContentRefs: [] };\n snapshot.info.set(childAriaNode.ref, elementInfo);\n snapshot.refs.set(element, childAriaNode.ref);\n if (childAriaNode.role === "iframe")\n snapshot.iframeRefs.push(childAriaNode.ref);\n }\n ariaNode.children.push(childAriaNode);\n }\n processElement(childAriaNode || ariaNode, element, ariaChildren, visible);\n if (elementInfo) {\n for (const contributor of nameSourceElements.get(childAriaNode) || []) {\n const ref = snapshot.refs.get(contributor);\n if (ref && ref !== childAriaNode.ref)\n elementInfo.nameFromContentRefs.push(ref);\n }\n }\n };\n function processElement(ariaNode, element, ariaChildren, parentElementVisible) {\n var _a;\n const display = ((_a = getElementComputedStyle(element)) == null ? void 0 : _a.display) || "inline";\n const treatAsBlock = display !== "inline" || element.nodeName === "BR" ? " " : "";\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n ariaNode.children.push(getCSSContent(element, "::before") || "");\n const assignedNodes = element.nodeName === "SLOT" ? element.assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(ariaNode, child, parentElementVisible);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (!child.assignedSlot)\n visit(ariaNode, child, parentElementVisible);\n }\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(ariaNode, child, parentElementVisible);\n }\n }\n for (const child of ariaChildren)\n visit(ariaNode, child, parentElementVisible);\n ariaNode.children.push(getCSSContent(element, "::after") || "");\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n if (ariaNode.children.length === 1 && ariaNode.name === ariaNode.children[0])\n ariaNode.children = [];\n if (ariaNode.role === "link" && element.hasAttribute("href")) {\n const href = element.getAttribute("href");\n ariaNode.props["url"] = truncateDataUrl(href);\n }\n if (ariaNode.role === "textbox" && element.hasAttribute("placeholder") && element.getAttribute("placeholder") !== ariaNode.name) {\n const placeholder = element.getAttribute("placeholder");\n ariaNode.props["placeholder"] = placeholder;\n }\n }\n beginAriaCaches();\n try {\n visit(snapshot.root, rootElement, true);\n } finally {\n endAriaCaches();\n }\n distillAriaSnapshot(snapshot, publicOptions);\n return snapshot;\n}\nfunction computeAriaRef(ariaNode, options) {\n var _a;\n if (options.refs === "none")\n return;\n if (options.refs === "interactable" && (!ariaNode.box.visible || !ariaNode.receivesPointerEvents))\n return;\n const element = ariaNodeElement(ariaNode);\n let ariaRef = element._ariaRef;\n if (!ariaRef || ariaRef.role !== ariaNode.role || ariaRef.name !== ariaNode.name) {\n ariaRef = { role: ariaNode.role, name: ariaNode.name, ref: ((_a = options.refPrefix) != null ? _a : "") + "e" + ++lastRef };\n element._ariaRef = ariaRef;\n }\n ariaNode.ref = ariaRef.ref;\n}\nfunction toAriaNode(element, options, nameSourceElements) {\n var _a;\n const active = element.ownerDocument.activeElement === element && element.ownerDocument.hasFocus();\n if (element.nodeName === "IFRAME" || element.nodeName === "FRAME") {\n const ariaNode = {\n role: "iframe",\n name: "",\n children: [],\n props: {},\n box: computeBox(element),\n receivesPointerEvents: true,\n active\n };\n setAriaNodeElement(ariaNode, element);\n computeAriaRef(ariaNode, options);\n return ariaNode;\n }\n const defaultRole = options.includeGenericRole ? "generic" : null;\n const role = (_a = getAriaRole(element)) != null ? _a : defaultRole;\n if (!role || role === "presentation" || role === "none")\n return null;\n const name = getElementAccessibleName(element, false);\n const receivesPointerEvents2 = receivesPointerEvents(element);\n const box = computeBox(element);\n if (role === "generic" && box.inline && element.childNodes.length === 1 && element.childNodes[0].nodeType === Node.TEXT_NODE)\n return null;\n const result = {\n role,\n name: normalizeWhiteSpace(name.text),\n children: [],\n props: {},\n box,\n receivesPointerEvents: receivesPointerEvents2,\n active\n };\n setAriaNodeElement(result, element);\n nameSourceElements.set(result, name.elements);\n computeAriaRef(result, options);\n if (kAriaCheckedRoles.includes(role))\n result.checked = getAriaChecked(element);\n if (kAriaDisabledRoles.includes(role))\n result.disabled = getAriaDisabled(element);\n if (kAriaExpandedRoles.includes(role))\n result.expanded = getAriaExpanded(element);\n if (kAriaInvalidRoles.includes(role)) {\n const invalid = getAriaInvalid(element);\n result.invalid = invalid === "false" ? false : invalid === "true" ? true : invalid;\n }\n if (kAriaLevelRoles.includes(role))\n result.level = getAriaLevel(element);\n if (kAriaPressedRoles.includes(role))\n result.pressed = getAriaPressed(element);\n if (kAriaSelectedRoles.includes(role))\n result.selected = getAriaSelected(element);\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element.type !== "checkbox" && element.type !== "radio" && element.type !== "file")\n result.children = [element.value];\n }\n return result;\n}\nfunction matchesStringOrRegex(text, template) {\n if (!template)\n return true;\n if (!text)\n return false;\n if (typeof template === "string")\n return text === template;\n return !!text.match(new RegExp(template.pattern));\n}\nfunction matchesTextValue(text, template) {\n if (!(template == null ? void 0 : template.normalized))\n return true;\n if (!text)\n return false;\n if (text === template.normalized)\n return true;\n if (text === template.raw)\n return true;\n const regex = cachedRegex(template);\n if (regex)\n return !!text.match(regex);\n return false;\n}\nvar cachedRegexSymbol = /* @__PURE__ */ Symbol("cachedRegex");\nfunction cachedRegex(template) {\n if (template[cachedRegexSymbol] !== void 0)\n return template[cachedRegexSymbol];\n const { raw } = template;\n const canBeRegex = raw.startsWith("/") && raw.endsWith("/") && raw.length > 1;\n let regex;\n try {\n regex = canBeRegex ? new RegExp(raw.slice(1, -1)) : null;\n } catch (e) {\n regex = null;\n }\n template[cachedRegexSymbol] = regex;\n return regex;\n}\nfunction matchesExpectAriaTemplate(rootElement, template) {\n const snapshot = generateAriaTree(rootElement, { mode: "default" });\n const matches = matchesNodeDeep(snapshot.root, template, false, false);\n return {\n matches,\n received: {\n raw: renderAriaTree(snapshot, { mode: "default" }).text,\n regex: renderAriaTree(snapshot, { mode: "codegen" }).text\n }\n };\n}\nfunction getAllElementsMatchingExpectAriaTemplate(rootElement, template) {\n const root = generateAriaTree(rootElement, { mode: "default" }).root;\n const matches = matchesNodeDeep(root, template, true, false);\n return matches.map((n) => ariaNodeElement(n));\n}\nfunction matchesNode(node, template, isDeepEqual) {\n var _a;\n if (typeof node === "string" && template.kind === "text")\n return matchesTextValue(node, template.text);\n if (node === null || typeof node !== "object" || template.kind !== "role")\n return false;\n if (template.role !== "fragment" && template.role !== node.role)\n return false;\n if (template.checked !== void 0 && template.checked !== node.checked)\n return false;\n if (template.disabled !== void 0 && template.disabled !== node.disabled)\n return false;\n if (template.expanded !== void 0 && template.expanded !== node.expanded)\n return false;\n if (template.invalid !== void 0 && template.invalid !== node.invalid)\n return false;\n if (template.level !== void 0 && template.level !== node.level)\n return false;\n if (template.pressed !== void 0 && template.pressed !== node.pressed)\n return false;\n if (template.selected !== void 0 && template.selected !== node.selected)\n return false;\n if (!matchesStringOrRegex(node.name, template.name))\n return false;\n if (!matchesTextValue(node.props.url, (_a = template.props) == null ? void 0 : _a.url))\n return false;\n if (template.containerMode === "contain")\n return containsList(node.children || [], template.children || []);\n if (template.containerMode === "equal")\n return listEqual(node.children || [], template.children || [], false);\n if (template.containerMode === "deep-equal" || isDeepEqual)\n return listEqual(node.children || [], template.children || [], true);\n return containsList(node.children || [], template.children || []);\n}\nfunction listEqual(children, template, isDeepEqual) {\n if (template.length !== children.length)\n return false;\n for (let i = 0; i < template.length; ++i) {\n if (!matchesNode(children[i], template[i], isDeepEqual))\n return false;\n }\n return true;\n}\nfunction containsList(children, template) {\n if (template.length > children.length)\n return false;\n const cc = children.slice();\n const tt = template.slice();\n for (const t of tt) {\n let c = cc.shift();\n while (c) {\n if (matchesNode(c, t, false))\n break;\n c = cc.shift();\n }\n if (!c)\n return false;\n }\n return true;\n}\nfunction matchesNodeDeep(root, template, collectAll, isDeepEqual) {\n const results = [];\n const visit = (node, parent) => {\n if (matchesNode(node, template, isDeepEqual)) {\n const result = typeof node === "string" ? parent : node;\n if (result)\n results.push(result);\n return !collectAll;\n }\n if (typeof node === "string")\n return false;\n for (const child of node.children || []) {\n if (visit(child, node))\n return true;\n }\n return false;\n };\n visit(root, null);\n return results;\n}\nfunction indent(depth) {\n return " ".repeat(depth);\n}\nfunction renderAriaTree(ariaSnapshot, publicOptions) {\n const options = toInternalOptions(publicOptions);\n const lines = [];\n const iframeDepths = {};\n const includeText = options.renderStringsAsRegex ? textContributesInfo : () => true;\n const renderString = options.renderStringsAsRegex ? convertToBestGuessRegex : (str) => str;\n const nodesToRender = ariaSnapshot.root.role === "fragment" ? ariaSnapshot.root.children : [ariaSnapshot.root];\n const visitText = (text, depth) => {\n if (publicOptions.depth && depth > publicOptions.depth)\n return;\n const escaped = yamlEscapeValueIfNeeded(renderString(text));\n if (escaped)\n lines.push(indent(depth) + "- text: " + escaped);\n };\n const createKey = (ariaNode, renderCursorPointer) => {\n let key = ariaNode.role;\n if (ariaNode.name && ariaNode.name.length <= 900) {\n const name = renderString(ariaNode.name);\n if (name) {\n const stringifiedName = name.startsWith("/") && name.endsWith("/") ? name : JSON.stringify(name);\n key += " " + stringifiedName;\n }\n }\n if (ariaNode.checked === "mixed")\n key += ` [checked=mixed]`;\n if (ariaNode.checked === true)\n key += ` [checked]`;\n if (ariaNode.disabled)\n key += ` [disabled]`;\n if (ariaNode.expanded)\n key += ` [expanded]`;\n if (ariaNode.active && options.renderActive)\n key += ` [active]`;\n if (ariaNode.invalid === "grammar" || ariaNode.invalid === "spelling")\n key += ` [invalid=${ariaNode.invalid}]`;\n if (ariaNode.invalid === true)\n key += ` [invalid]`;\n if (ariaNode.level)\n key += ` [level=${ariaNode.level}]`;\n if (ariaNode.pressed === "mixed")\n key += ` [pressed=mixed]`;\n if (ariaNode.pressed === true)\n key += ` [pressed]`;\n if (ariaNode.selected === true)\n key += ` [selected]`;\n if (ariaNode.ref) {\n key += ` [ref=${ariaNode.ref}]`;\n if (renderCursorPointer && hasPointerCursor(ariaNode))\n key += " [cursor=pointer]";\n }\n if (options.renderBoxes) {\n const element = ariaNodeElement(ariaNode);\n if (element) {\n const r = element.getBoundingClientRect();\n key += ` [box=${Math.round(r.x)},${Math.round(r.y)},${Math.round(r.width)},${Math.round(r.height)}]`;\n }\n }\n return key;\n };\n const getSingleTextChild = (ariaNode) => {\n return ariaNode.children.length === 1 && typeof ariaNode.children[0] === "string" && !Object.keys(ariaNode.props).length ? ariaNode.children[0] : void 0;\n };\n const visit = (ariaNode, depth, renderCursorPointer) => {\n if (publicOptions.depth && depth > publicOptions.depth)\n return;\n if (ariaNode.role === "iframe" && ariaNode.ref)\n iframeDepths[ariaNode.ref] = depth;\n const escapedKey = indent(depth) + "- " + yamlEscapeKeyIfNeeded(createKey(ariaNode, renderCursorPointer));\n const singleTextChild = getSingleTextChild(ariaNode);\n const isAtDepthLimit = !!publicOptions.depth && depth === publicOptions.depth;\n const hasNoChildren = !singleTextChild && (!ariaNode.children.length || isAtDepthLimit);\n if (hasNoChildren && !Object.keys(ariaNode.props).length) {\n lines.push(escapedKey);\n } else if (singleTextChild !== void 0) {\n const shouldInclude = includeText(ariaNode, singleTextChild);\n if (shouldInclude)\n lines.push(escapedKey + ": " + yamlEscapeValueIfNeeded(renderString(singleTextChild)));\n else\n lines.push(escapedKey);\n } else {\n lines.push(escapedKey + ":");\n for (const [name, value] of Object.entries(ariaNode.props))\n lines.push(indent(depth + 1) + "- /" + name + ": " + yamlEscapeValueIfNeeded(value));\n const inCursorPointer = !!ariaNode.ref && renderCursorPointer && hasPointerCursor(ariaNode);\n for (const child of ariaNode.children) {\n if (typeof child === "string")\n visitText(includeText(ariaNode, child) ? child : "", depth + 1);\n else\n visit(child, depth + 1, renderCursorPointer && !inCursorPointer);\n }\n }\n };\n for (const nodeToRender of nodesToRender) {\n if (typeof nodeToRender === "string")\n visitText(nodeToRender, 0);\n else\n visit(nodeToRender, 0, !!options.renderCursorPointer);\n }\n return { text: lines.join("\\n"), iframeDepths };\n}\nfunction convertToBestGuessRegex(text) {\n const dynamicContent = [\n // 550e8400-e29b-41d4-a716-446655440000\n { regex: /\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b/, replacement: "[0-9a-fA-F-]+" },\n // 2mb\n { regex: /\\b[\\d,.]+[bkmBKM]+\\b/, replacement: "[\\\\d,.]+[bkmBKM]+" },\n // 2ms, 20s\n { regex: /\\b\\d+[hmsp]+\\b/, replacement: "\\\\d+[hmsp]+" },\n { regex: /\\b[\\d,.]+[hmsp]+\\b/, replacement: "[\\\\d,.]+[hmsp]+" },\n // Do not replace single digits with regex by default.\n // 2+ digits: [Issue 22, 22.3, 2.33, 2,333]\n { regex: /\\b\\d+,\\d+\\b/, replacement: "\\\\d+,\\\\d+" },\n { regex: /\\b\\d+\\.\\d{2,}\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\.\\d+\\b/, replacement: "\\\\d+\\\\.\\\\d+" },\n { regex: /\\b\\d{2,}\\b/, replacement: "\\\\d+" }\n ];\n let pattern = "";\n let lastIndex = 0;\n const combinedRegex = new RegExp(dynamicContent.map((r) => "(" + r.regex.source + ")").join("|"), "g");\n text.replace(combinedRegex, (match, ...args) => {\n const offset = args[args.length - 2];\n const groups = args.slice(0, -2);\n pattern += escapeRegExp(text.slice(lastIndex, offset));\n for (let i = 0; i < groups.length; i++) {\n if (groups[i]) {\n const { replacement } = dynamicContent[i];\n pattern += replacement;\n break;\n }\n }\n lastIndex = offset + match.length;\n return match;\n });\n if (!pattern)\n return text;\n pattern += escapeRegExp(text.slice(lastIndex));\n return String(new RegExp(pattern));\n}\nfunction textContributesInfo(node, text) {\n if (!text.length)\n return false;\n if (!node.name)\n return true;\n const substr = text.length <= 200 && node.name.length <= 200 ? longestCommonSubstring(text, node.name) : "";\n let filtered = text;\n while (substr && filtered.includes(substr))\n filtered = filtered.replace(substr, "");\n return filtered.trim().length / text.length > 0.1;\n}\nvar elementSymbol = /* @__PURE__ */ Symbol("element");\nfunction ariaNodeElement(ariaNode) {\n return ariaNode[elementSymbol];\n}\nfunction setAriaNodeElement(ariaNode, element) {\n ariaNode[elementSymbol] = element;\n}\nfunction findNewElement(from, to) {\n const node = findNewNode(from, to);\n return node ? ariaNodeElement(node) : void 0;\n}\n\n// packages/injected/src/highlight.css?inline\nvar highlight_default = ":host{font-size:13px;font-family:system-ui,Ubuntu,Droid Sans,sans-serif;color:#333;color-scheme:light}svg{position:absolute;height:0}x-pw-tooltip{backdrop-filter:blur(5px);background-color:#fff;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:none;font-size:12.8px;font-weight:400;left:0;line-height:1.5;max-width:600px;position:absolute;top:0;padding:0;flex-direction:column;overflow:hidden}x-pw-tooltip-line{display:flex;max-width:600px;padding:6px;user-select:none;cursor:pointer}x-pw-tooltip-footer{display:flex;max-width:600px;padding:6px;user-select:none;color:#777}x-pw-dialog{background-color:#fff;pointer-events:auto;border-radius:6px;box-shadow:0 .5rem 1.2rem #0000004d;display:flex;flex-direction:column;position:absolute;z-index:10;font-size:13px}x-pw-dialog:not(.autosize){width:400px;height:150px}x-pw-dialog-body{display:flex;flex-direction:column;flex:auto}x-pw-dialog-body label{margin:5px 8px;display:flex;flex-direction:row;align-items:center}x-pw-highlight{position:absolute;top:0;left:0;width:0;height:0}x-pw-action-point{position:absolute;width:20px;height:20px;background:red;border-radius:10px;margin:-10px 0 0 -10px;z-index:2}x-pw-action-cursor{position:absolute;width:18px;height:22px;pointer-events:none;z-index:4;filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}x-pw-action-cursor svg{width:100%;height:100%;position:static}x-pw-title{position:absolute;backdrop-filter:blur(5px);background-color:#00000080;color:#fff;border-radius:6px;padding:6px;font-size:24px;line-height:1.4;white-space:nowrap;user-select:none;z-index:3}x-pw-user-overlays,x-pw-user-overlay{position:absolute;inset:0}@keyframes pw-fade-out{0%{opacity:1}to{opacity:0}}x-pw-separator{height:1px;margin:6px 9px;background:#949494e5}x-pw-tool-gripper{height:28px;width:24px;margin:2px 0;cursor:grab}x-pw-tool-gripper:active{cursor:grabbing}x-pw-tool-gripper>x-div{width:16px;height:16px;margin:6px 4px;clip-path:url(#icon-gripper);background-color:#555}x-pw-tools-list>label{display:flex;align-items:center;margin:0 10px;user-select:none}x-pw-tools-list{display:flex;width:100%;border-bottom:1px solid #dddddd}x-pw-tool-item{pointer-events:auto;height:28px;width:28px;border-radius:3px}x-pw-tool-item:not(.disabled){cursor:pointer}x-pw-tool-item:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.toggled{background-color:#8acae480}x-pw-tool-item.toggled:not(.disabled):hover{background-color:#8acae4c4}x-pw-tool-item>x-div{width:16px;height:16px;margin:6px;background-color:#3a3a3a}x-pw-tool-item.disabled>x-div{background-color:#61616180;cursor:default}x-pw-tool-item.record.toggled{background-color:transparent}x-pw-tool-item.record.toggled:not(.disabled):hover{background-color:#dbdbdb}x-pw-tool-item.record.toggled>x-div{background-color:#a1260d}x-pw-tool-item.record.disabled.toggled>x-div{opacity:.8}x-pw-tool-item.accept>x-div{background-color:#388a34}x-pw-tool-item.record>x-div{clip-path:url(#icon-circle-large-filled)}x-pw-tool-item.record.toggled>x-div{clip-path:url(#icon-stop-circle)}x-pw-tool-item.pick-locator>x-div{clip-path:url(#icon-inspect)}x-pw-tool-item.text>x-div{clip-path:url(#icon-whole-word)}x-pw-tool-item.visibility>x-div{clip-path:url(#icon-eye)}x-pw-tool-item.value>x-div{clip-path:url(#icon-symbol-constant)}x-pw-tool-item.snapshot>x-div{clip-path:url(#icon-gist)}x-pw-tool-item.accept>x-div{clip-path:url(#icon-check)}x-pw-tool-item.cancel>x-div{clip-path:url(#icon-close)}x-pw-tool-item.succeeded>x-div{clip-path:url(#icon-pass);background-color:#388a34!important}x-pw-overlay{position:absolute;top:0;max-width:min-content;z-index:2147483647;background:transparent;pointer-events:auto}x-pw-overlay x-pw-tools-list{background-color:#fffd;box-shadow:#0000001a 0 5px 5px;border-radius:3px;border-bottom:none}x-pw-overlay x-pw-tool-item{margin:2px}textarea.text-editor{font-family:system-ui,Ubuntu,Droid Sans,sans-serif;flex:auto;border:none;margin:6px 10px;color:#333;outline:1px solid transparent!important;resize:none;padding:0;font-size:13px}textarea.text-editor.does-not-match{outline:1px solid red!important}x-div{display:block}x-spacer{flex:auto}*{box-sizing:border-box}*[hidden]{display:none!important}x-locator-editor{flex:none;width:100%;height:60px;padding:4px;border-bottom:1px solid #dddddd;outline:1px solid transparent}x-locator-editor.does-not-match{outline:1px solid red}.CodeMirror{width:100%!important;height:100%!important}x-pw-action-list{flex:auto;display:flex;flex-direction:column;user-select:none}x-pw-action-item{padding:6px 10px;cursor:pointer;overflow:hidden}x-pw-action-item:hover{background-color:#f2f2f2}x-pw-action-item:last-child{border-bottom-left-radius:6px;border-bottom-right-radius:6px}\\n";\n\n// packages/injected/src/highlight.ts\nvar Highlight = class {\n constructor(injectedScript) {\n this._renderedEntries = [];\n this._userOverlays = /* @__PURE__ */ new Map();\n this._userOverlayHidden = false;\n this._language = "javascript";\n this._elementHighlightSelectors = /* @__PURE__ */ new Map();\n this._injectedScript = injectedScript;\n const document = injectedScript.document;\n this._isUnderTest = injectedScript.isUnderTest;\n this._glassPaneElement = document.createElement("x-pw-glass");\n this._glassPaneElement.setAttribute("popover", "manual");\n this._glassPaneElement.style.inset = "0";\n this._glassPaneElement.style.width = "100%";\n this._glassPaneElement.style.height = "100%";\n this._glassPaneElement.style.maxWidth = "none";\n this._glassPaneElement.style.maxHeight = "none";\n this._glassPaneElement.style.padding = "0";\n this._glassPaneElement.style.margin = "0";\n this._glassPaneElement.style.border = "none";\n this._glassPaneElement.style.overflow = "visible";\n this._glassPaneElement.style.pointerEvents = "none";\n this._glassPaneElement.style.display = "flex";\n this._glassPaneElement.style.backgroundColor = "transparent";\n this._actionPointElement = document.createElement("x-pw-action-point");\n this._actionPointElement.setAttribute("hidden", "true");\n this._actionCursorElement = document.createElement("x-pw-action-cursor");\n this._actionCursorElement.style.visibility = "hidden";\n this._actionCursorElement.appendChild(this._createCursorSvg(document));\n this._titleElement = document.createElement("x-pw-title");\n this._titleElement.setAttribute("hidden", "true");\n this._userOverlayContainer = document.createElement("x-pw-user-overlays");\n this._userOverlayContainer.setAttribute("hidden", "true");\n this._glassPaneShadow = this._glassPaneElement.attachShadow({ mode: this._isUnderTest ? "open" : "closed" });\n if (typeof this._glassPaneShadow.adoptedStyleSheets.push === "function") {\n const sheet = new this._injectedScript.window.CSSStyleSheet();\n sheet.replaceSync(highlight_default);\n this._glassPaneShadow.adoptedStyleSheets.push(sheet);\n } else {\n const styleElement = this._injectedScript.document.createElement("style");\n styleElement.textContent = highlight_default;\n this._glassPaneShadow.appendChild(styleElement);\n }\n this._glassPaneShadow.appendChild(this._actionPointElement);\n this._glassPaneShadow.appendChild(this._actionCursorElement);\n this._glassPaneShadow.appendChild(this._titleElement);\n this._glassPaneShadow.appendChild(this._userOverlayContainer);\n }\n install() {\n if (!this._injectedScript.document.documentElement)\n return;\n if (!this._injectedScript.document.documentElement.contains(this._glassPaneElement) || this._glassPaneElement.nextElementSibling)\n this._injectedScript.document.documentElement.appendChild(this._glassPaneElement);\n this._bringToFront();\n }\n _bringToFront() {\n this._glassPaneElement.hidePopover();\n this._glassPaneElement.showPopover();\n }\n setLanguage(language) {\n this._language = language;\n }\n addElementHighlight(selector, cssStyle) {\n const key = stringifySelector(selector);\n this._elementHighlightSelectors.set(key, { selector, cssStyle });\n this._ensureElementHighlightRaf();\n }\n removeElementHighlight(selector) {\n const key = stringifySelector(selector);\n if (!this._elementHighlightSelectors.delete(key))\n return;\n if (this._elementHighlightSelectors.size === 0) {\n if (this._rafRequest) {\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n this._rafRequest = void 0;\n }\n this.clearHighlight();\n }\n }\n _ensureElementHighlightRaf() {\n if (this._rafRequest)\n return;\n const tick = () => {\n const entries = [];\n for (const { selector, cssStyle } of this._elementHighlightSelectors.values()) {\n const elements = this._injectedScript.querySelectorAll(selector, this._injectedScript.document.documentElement);\n const locator = asLocator(this._language, stringifySelector(selector));\n const color = elements.length > 1 ? "#f6b26b7f" : "#6fa8dc7f";\n for (let i = 0; i < elements.length; ++i) {\n const suffix = elements.length > 1 ? ` [${i + 1} of ${elements.length}]` : "";\n entries.push({ element: elements[i], color, tooltipText: locator + suffix, cssStyle });\n }\n }\n this.updateHighlight(entries);\n this._rafRequest = this._injectedScript.utils.builtins.requestAnimationFrame(tick);\n };\n this._rafRequest = this._injectedScript.utils.builtins.requestAnimationFrame(tick);\n }\n uninstall() {\n if (this._rafRequest) {\n this._injectedScript.utils.builtins.cancelAnimationFrame(this._rafRequest);\n this._rafRequest = void 0;\n }\n this._elementHighlightSelectors.clear();\n this._glassPaneElement.remove();\n }\n showActionPoint(x, y, fadeDuration) {\n this._actionPointElement.style.top = y + "px";\n this._actionPointElement.style.left = x + "px";\n this._actionPointElement.hidden = false;\n if (fadeDuration)\n this._actionPointElement.style.animation = `pw-fade-out ${fadeDuration}ms ease-out forwards`;\n else\n this._actionPointElement.style.animation = "";\n }\n hideActionPoint() {\n this._actionPointElement.hidden = true;\n }\n moveActionCursor(x, y, fadeDuration) {\n const moveDuration = fadeDuration ? Math.max(80, Math.min(fadeDuration * 0.6, 400)) : 0;\n this._actionCursorElement.style.transition = `top ${moveDuration}ms ease, left ${moveDuration}ms ease`;\n this._actionCursorElement.style.left = x + "px";\n this._actionCursorElement.style.top = y + "px";\n this._actionCursorElement.style.visibility = "visible";\n }\n hideActionCursor() {\n this._actionCursorElement.style.visibility = "hidden";\n }\n _createCursorSvg(document) {\n const svgNs = "http://www.w3.org/2000/svg";\n const svg = document.createElementNS(svgNs, "svg");\n svg.setAttribute("viewBox", "0 0 18 22");\n const path = document.createElementNS(svgNs, "path");\n path.setAttribute("d", "M1 1 L1 17 L5.5 13 L8 20.5 L11 19.5 L8.5 12 L15 12 Z");\n path.setAttribute("fill", "white");\n path.setAttribute("stroke", "black");\n path.setAttribute("stroke-width", "1.5");\n path.setAttribute("stroke-linejoin", "round");\n svg.appendChild(path);\n return svg;\n }\n showActionTitle(text, fadeDuration, position, fontSize) {\n this._titleElement.textContent = text;\n this._titleElement.hidden = false;\n if (fadeDuration) {\n const fadeTime = fadeDuration / 4;\n this._titleElement.style.animation = `pw-fade-out ${fadeTime}ms ease-out ${fadeDuration - fadeTime}ms forwards`;\n } else {\n this._titleElement.style.animation = "";\n }\n this._titleElement.style.top = "";\n this._titleElement.style.bottom = "";\n this._titleElement.style.left = "";\n this._titleElement.style.right = "";\n this._titleElement.style.transform = "";\n switch (position) {\n case "top-left":\n this._titleElement.style.top = "6px";\n this._titleElement.style.left = "6px";\n break;\n case "top":\n this._titleElement.style.top = "6px";\n this._titleElement.style.left = "50%";\n this._titleElement.style.transform = "translateX(-50%)";\n break;\n case "bottom-left":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.left = "6px";\n break;\n case "bottom":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.left = "50%";\n this._titleElement.style.transform = "translateX(-50%)";\n break;\n case "bottom-right":\n this._titleElement.style.bottom = "6px";\n this._titleElement.style.right = "6px";\n break;\n case "top-right":\n default:\n this._titleElement.style.top = "6px";\n this._titleElement.style.right = "6px";\n break;\n }\n if (fontSize)\n this._titleElement.style.fontSize = fontSize + "px";\n }\n hideActionTitle() {\n this._titleElement.hidden = true;\n }\n addUserOverlay(id, html) {\n const element = this._injectedScript.document.createElement("div");\n element.className = "x-pw-user-overlay";\n element.innerHTML = html;\n for (const script of element.querySelectorAll("script"))\n script.remove();\n for (const el of element.querySelectorAll("*")) {\n for (const attr of [...el.attributes]) {\n if (attr.name.startsWith("on"))\n el.removeAttribute(attr.name);\n }\n }\n this._userOverlays.set(id, element);\n this._userOverlayContainer.appendChild(element);\n this._userOverlayContainer.hidden = this._userOverlayHidden;\n return id;\n }\n getUserOverlay(id) {\n return this._userOverlays.get(id);\n }\n removeUserOverlay(id) {\n const element = this._userOverlays.get(id);\n if (element) {\n element.remove();\n this._userOverlays.delete(id);\n }\n if (this._userOverlays.size === 0)\n this._userOverlayContainer.hidden = true;\n }\n setUserOverlaysVisible(visible) {\n this._userOverlayHidden = !visible;\n this._userOverlayContainer.hidden = !visible || this._userOverlays.size === 0;\n }\n clearHighlight() {\n var _a, _b;\n for (const entry of this._renderedEntries) {\n (_a = entry.highlightElement) == null ? void 0 : _a.remove();\n (_b = entry.tooltipElement) == null ? void 0 : _b.remove();\n }\n this._renderedEntries = [];\n }\n addMaskedElements(elements, color) {\n const existingEntries = this._renderedEntries.map((e) => ({ element: e.targetElement, color: e.color }));\n const newEntries = elements.map((element) => ({ element, color }));\n this.updateHighlight([...existingEntries, ...newEntries]);\n }\n updateHighlight(entries) {\n if (this._highlightIsUpToDate(entries))\n return;\n this.clearHighlight();\n for (const entry of entries) {\n const highlightElement = this._createHighlightElement();\n this._glassPaneShadow.appendChild(highlightElement);\n let tooltipElement;\n if (entry.tooltipText) {\n tooltipElement = this._injectedScript.document.createElement("x-pw-tooltip");\n this._glassPaneShadow.appendChild(tooltipElement);\n tooltipElement.style.top = "0";\n tooltipElement.style.left = "0";\n tooltipElement.style.display = "flex";\n const lineElement = this._injectedScript.document.createElement("x-pw-tooltip-line");\n lineElement.textContent = entry.tooltipText;\n tooltipElement.appendChild(lineElement);\n }\n this._renderedEntries.push({ targetElement: entry.element, box: toDOMRect(entry.box), color: entry.color, borderColor: entry.borderColor, fadeDuration: entry.fadeDuration, cssStyle: entry.cssStyle, tooltipElement, highlightElement });\n }\n for (const entry of this._renderedEntries) {\n if (!entry.box && !entry.targetElement)\n continue;\n entry.box = entry.box || entry.targetElement.getBoundingClientRect();\n if (!entry.tooltipElement)\n continue;\n const { anchorLeft, anchorTop } = this.tooltipPosition(entry.box, entry.tooltipElement);\n entry.tooltipTop = anchorTop;\n entry.tooltipLeft = anchorLeft;\n }\n for (const entry of this._renderedEntries) {\n if (entry.tooltipElement) {\n entry.tooltipElement.style.top = entry.tooltipTop + "px";\n entry.tooltipElement.style.left = entry.tooltipLeft + "px";\n }\n const box = entry.box;\n entry.highlightElement.style.backgroundColor = entry.color;\n entry.highlightElement.style.left = box.x + "px";\n entry.highlightElement.style.top = box.y + "px";\n entry.highlightElement.style.width = box.width + "px";\n entry.highlightElement.style.height = box.height + "px";\n entry.highlightElement.style.display = "block";\n if (entry.borderColor)\n entry.highlightElement.style.border = "2px solid " + entry.borderColor;\n if (entry.fadeDuration)\n entry.highlightElement.style.animation = `pw-fade-out ${entry.fadeDuration}ms ease-out forwards`;\n if (entry.cssStyle)\n entry.highlightElement.style.cssText += ";" + entry.cssStyle;\n if (this._isUnderTest)\n console.error("Highlight box for test: " + JSON.stringify({ x: box.x, y: box.y, width: box.width, height: box.height }));\n }\n }\n firstBox() {\n var _a;\n return (_a = this._renderedEntries[0]) == null ? void 0 : _a.box;\n }\n firstTooltipBox() {\n const entry = this._renderedEntries[0];\n if (!entry || !entry.tooltipElement || entry.tooltipLeft === void 0 || entry.tooltipTop === void 0)\n return;\n return {\n x: entry.tooltipLeft,\n y: entry.tooltipTop,\n left: entry.tooltipLeft,\n top: entry.tooltipTop,\n width: entry.tooltipElement.offsetWidth,\n height: entry.tooltipElement.offsetHeight,\n bottom: entry.tooltipTop + entry.tooltipElement.offsetHeight,\n right: entry.tooltipLeft + entry.tooltipElement.offsetWidth,\n toJSON: () => {\n }\n };\n }\n // Note: there is a copy of this method in dialog.tsx. Please fix bugs in both places.\n tooltipPosition(box, tooltipElement) {\n const tooltipWidth = tooltipElement.offsetWidth;\n const tooltipHeight = tooltipElement.offsetHeight;\n const totalWidth = this._glassPaneElement.offsetWidth;\n const totalHeight = this._glassPaneElement.offsetHeight;\n let anchorLeft = Math.max(5, box.left);\n if (anchorLeft + tooltipWidth > totalWidth - 5)\n anchorLeft = totalWidth - tooltipWidth - 5;\n let anchorTop = Math.max(0, box.bottom) + 5;\n if (anchorTop + tooltipHeight > totalHeight - 5) {\n if (Math.max(0, box.top) > tooltipHeight + 5) {\n anchorTop = Math.max(0, box.top) - tooltipHeight - 5;\n } else {\n anchorTop = totalHeight - 5 - tooltipHeight;\n }\n }\n return { anchorLeft, anchorTop };\n }\n _highlightIsUpToDate(entries) {\n if (entries.length !== this._renderedEntries.length)\n return false;\n for (let i = 0; i < this._renderedEntries.length; ++i) {\n if (entries[i].element !== this._renderedEntries[i].targetElement)\n return false;\n if (entries[i].color !== this._renderedEntries[i].color)\n return false;\n if (entries[i].cssStyle !== this._renderedEntries[i].cssStyle)\n return false;\n const oldBox = this._renderedEntries[i].box;\n if (!oldBox)\n return false;\n const box = entries[i].box ? toDOMRect(entries[i].box) : entries[i].element.getBoundingClientRect();\n if (box.top !== oldBox.top || box.right !== oldBox.right || box.bottom !== oldBox.bottom || box.left !== oldBox.left)\n return false;\n }\n return true;\n }\n _createHighlightElement() {\n return this._injectedScript.document.createElement("x-pw-highlight");\n }\n appendChild(element) {\n this._glassPaneShadow.appendChild(element);\n }\n onGlassPaneClick(handler) {\n this._glassPaneElement.style.pointerEvents = "auto";\n this._glassPaneElement.style.backgroundColor = "rgba(0, 0, 0, 0.3)";\n this._glassPaneElement.addEventListener("click", handler);\n }\n offGlassPaneClick(handler) {\n this._glassPaneElement.style.pointerEvents = "none";\n this._glassPaneElement.style.backgroundColor = "transparent";\n this._glassPaneElement.removeEventListener("click", handler);\n }\n};\nfunction toDOMRect(box) {\n if (!box)\n return void 0;\n return new DOMRect(box.x, box.y, box.width, box.height);\n}\n\n// packages/injected/src/layoutSelectorUtils.ts\nfunction boxRightOf(box1, box2, maxDistance) {\n const distance = box1.left - box2.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxLeftOf(box1, box2, maxDistance) {\n const distance = box2.left - box1.right;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box2.bottom - box1.bottom, 0) + Math.max(box1.top - box2.top, 0);\n}\nfunction boxAbove(box1, box2, maxDistance) {\n const distance = box2.top - box1.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxBelow(box1, box2, maxDistance) {\n const distance = box1.top - box2.bottom;\n if (distance < 0 || maxDistance !== void 0 && distance > maxDistance)\n return;\n return distance + Math.max(box1.left - box2.left, 0) + Math.max(box2.right - box1.right, 0);\n}\nfunction boxNear(box1, box2, maxDistance) {\n const kThreshold = maxDistance === void 0 ? 50 : maxDistance;\n let score = 0;\n if (box1.left - box2.right >= 0)\n score += box1.left - box2.right;\n if (box2.left - box1.right >= 0)\n score += box2.left - box1.right;\n if (box2.top - box1.bottom >= 0)\n score += box2.top - box1.bottom;\n if (box1.top - box2.bottom >= 0)\n score += box1.top - box2.bottom;\n return score > kThreshold ? void 0 : score;\n}\nvar kLayoutSelectorNames = ["left-of", "right-of", "above", "below", "near"];\nfunction layoutSelectorScore(name, element, inner, maxDistance) {\n const box = element.getBoundingClientRect();\n const scorer = { "left-of": boxLeftOf, "right-of": boxRightOf, "above": boxAbove, "below": boxBelow, "near": boxNear }[name];\n let bestScore;\n for (const e of inner) {\n if (e === element)\n continue;\n const score = scorer(box, e.getBoundingClientRect(), maxDistance);\n if (score === void 0)\n continue;\n if (bestScore === void 0 || score < bestScore)\n bestScore = score;\n }\n return bestScore;\n}\n\n// packages/injected/src/selectorUtils.ts\nfunction matchesAttributePart(value, attr) {\n const objValue = typeof value === "string" && !attr.caseSensitive ? value.toUpperCase() : value;\n const attrValue = typeof attr.value === "string" && !attr.caseSensitive ? attr.value.toUpperCase() : attr.value;\n if (attr.op === "")\n return !!objValue;\n if (attr.op === "=") {\n if (attrValue instanceof RegExp)\n return typeof objValue === "string" && !!objValue.match(attrValue);\n return objValue === attrValue;\n }\n if (typeof objValue !== "string" || typeof attrValue !== "string")\n return false;\n if (attr.op === "*=")\n return objValue.includes(attrValue);\n if (attr.op === "^=")\n return objValue.startsWith(attrValue);\n if (attr.op === "$=")\n return objValue.endsWith(attrValue);\n if (attr.op === "|=")\n return objValue === attrValue || objValue.startsWith(attrValue + "-");\n if (attr.op === "~=")\n return objValue.split(" ").includes(attrValue);\n return false;\n}\nfunction shouldSkipForTextMatching(element) {\n const document = element.ownerDocument;\n return element.nodeName === "SCRIPT" || element.nodeName === "NOSCRIPT" || element.nodeName === "STYLE" || document.head && document.head.contains(element);\n}\nfunction elementText(cache, root) {\n let value = cache.get(root);\n if (value === void 0) {\n value = { full: "", normalized: "", immediate: [] };\n if (!shouldSkipForTextMatching(root)) {\n let currentImmediate = "";\n if (root instanceof HTMLInputElement && (root.type === "submit" || root.type === "button" || root.type === "reset")) {\n value = { full: root.value, normalized: normalizeWhiteSpace(root.value), immediate: [root.value] };\n } else {\n for (let child = root.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.TEXT_NODE) {\n value.full += child.nodeValue || "";\n currentImmediate += child.nodeValue || "";\n } else if (child.nodeType === Node.COMMENT_NODE) {\n continue;\n } else {\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n currentImmediate = "";\n if (child.nodeType === Node.ELEMENT_NODE)\n value.full += elementText(cache, child).full;\n }\n }\n if (currentImmediate)\n value.immediate.push(currentImmediate);\n if (root.shadowRoot)\n value.full += elementText(cache, root.shadowRoot).full;\n if (value.full)\n value.normalized = normalizeWhiteSpace(value.full);\n }\n }\n cache.set(root, value);\n }\n return value;\n}\nfunction elementMatchesText(cache, element, matcher) {\n if (shouldSkipForTextMatching(element))\n return "none";\n if (!matcher(elementText(cache, element)))\n return "none";\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === Node.ELEMENT_NODE && matcher(elementText(cache, child)))\n return "selfAndChildren";\n }\n if (element.shadowRoot && matcher(elementText(cache, element.shadowRoot)))\n return "selfAndChildren";\n return "self";\n}\nfunction getElementLabels(textCache, element) {\n const labels = getAriaLabelledByElements(element);\n if (labels)\n return labels.map((label) => elementText(textCache, label));\n const ariaLabel = element.getAttribute("aria-label");\n if (ariaLabel !== null && !!ariaLabel.trim())\n return [{ full: ariaLabel, normalized: normalizeWhiteSpace(ariaLabel), immediate: [ariaLabel] }];\n const isNonHiddenInput = element.nodeName === "INPUT" && element.type !== "hidden";\n if (["BUTTON", "METER", "OUTPUT", "PROGRESS", "SELECT", "TEXTAREA"].includes(element.nodeName) || isNonHiddenInput) {\n const labels2 = element.labels;\n if (labels2)\n return [...labels2].map((label) => elementText(textCache, label));\n }\n return [];\n}\n\n// packages/injected/src/roleSelectorEngine.ts\nvar kSupportedAttributes = ["selected", "checked", "pressed", "expanded", "level", "disabled", "name", "description", "include-hidden"];\nkSupportedAttributes.sort();\nfunction validateSupportedRole(attr, roles, role) {\n if (!roles.includes(role))\n throw new Error(`"${attr}" attribute is only supported for roles: ${roles.slice().sort().map((role2) => `"${role2}"`).join(", ")}`);\n}\nfunction validateSupportedValues(attr, values) {\n if (attr.op !== "" && !values.includes(attr.value))\n throw new Error(`"${attr.name}" must be one of ${values.map((v) => JSON.stringify(v)).join(", ")}`);\n}\nfunction validateSupportedOp(attr, ops) {\n if (!ops.includes(attr.op))\n throw new Error(`"${attr.name}" does not support "${attr.op}" matcher`);\n}\nfunction validateAttributes(attrs, role) {\n const options = { role };\n for (const attr of attrs) {\n switch (attr.name) {\n case "checked": {\n validateSupportedRole(attr.name, kAriaCheckedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.checked = attr.op === "" ? true : attr.value;\n break;\n }\n case "pressed": {\n validateSupportedRole(attr.name, kAriaPressedRoles, role);\n validateSupportedValues(attr, [true, false, "mixed"]);\n validateSupportedOp(attr, ["", "="]);\n options.pressed = attr.op === "" ? true : attr.value;\n break;\n }\n case "selected": {\n validateSupportedRole(attr.name, kAriaSelectedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.selected = attr.op === "" ? true : attr.value;\n break;\n }\n case "expanded": {\n validateSupportedRole(attr.name, kAriaExpandedRoles, role);\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.expanded = attr.op === "" ? true : attr.value;\n break;\n }\n case "level": {\n validateSupportedRole(attr.name, kAriaLevelRoles, role);\n if (typeof attr.value === "string")\n attr.value = +attr.value;\n if (attr.op !== "=" || typeof attr.value !== "number" || Number.isNaN(attr.value))\n throw new Error(`"level" attribute must be compared to a number`);\n options.level = attr.value;\n break;\n }\n case "disabled": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.disabled = attr.op === "" ? true : attr.value;\n break;\n }\n case "name": {\n if (attr.op === "")\n throw new Error(`"name" attribute must have a value`);\n if (typeof attr.value !== "string" && !(attr.value instanceof RegExp))\n throw new Error(`"name" attribute must be a string or a regular expression`);\n options.name = attr.value;\n options.nameOp = attr.op;\n options.nameExact = attr.caseSensitive;\n break;\n }\n case "description": {\n if (attr.op === "")\n throw new Error(`"description" attribute must have a value`);\n if (typeof attr.value !== "string" && !(attr.value instanceof RegExp))\n throw new Error(`"description" attribute must be a string or a regular expression`);\n options.description = attr.value;\n options.descriptionOp = attr.op;\n options.descriptionExact = attr.caseSensitive;\n break;\n }\n case "include-hidden": {\n validateSupportedValues(attr, [true, false]);\n validateSupportedOp(attr, ["", "="]);\n options.includeHidden = attr.op === "" ? true : attr.value;\n break;\n }\n default: {\n throw new Error(`Unknown attribute "${attr.name}", must be one of ${kSupportedAttributes.map((a) => `"${a}"`).join(", ")}.`);\n }\n }\n }\n return options;\n}\nfunction queryRole(scope, options, internal) {\n const result = [];\n const match = (element) => {\n if (getAriaRole(element) !== options.role)\n return;\n if (options.selected !== void 0 && getAriaSelected(element) !== options.selected)\n return;\n if (options.checked !== void 0 && getAriaChecked(element) !== options.checked)\n return;\n if (options.pressed !== void 0 && getAriaPressed(element) !== options.pressed)\n return;\n if (options.expanded !== void 0 && getAriaExpanded(element) !== options.expanded)\n return;\n if (options.level !== void 0 && getAriaLevel(element) !== options.level)\n return;\n if (options.disabled !== void 0 && getAriaDisabled(element) !== options.disabled)\n return;\n if (!options.includeHidden) {\n const isHidden = isElementHiddenForAria(element);\n if (isHidden)\n return;\n }\n if (options.name !== void 0) {\n const accessibleName = normalizeWhiteSpace(getElementAccessibleNameText(element, !!options.includeHidden));\n if (typeof options.name === "string")\n options.name = normalizeWhiteSpace(options.name);\n if (internal && !options.nameExact && options.nameOp === "=")\n options.nameOp = "*=";\n if (!matchesAttributePart(accessibleName, { name: "", jsonPath: [], op: options.nameOp || "=", value: options.name, caseSensitive: !!options.nameExact }))\n return;\n }\n if (options.description !== void 0) {\n const accessibleDescription = normalizeWhiteSpace(getElementAccessibleDescription(element, !!options.includeHidden));\n if (typeof options.description === "string")\n options.description = normalizeWhiteSpace(options.description);\n if (internal && !options.descriptionExact && options.descriptionOp === "=")\n options.descriptionOp = "*=";\n if (!matchesAttributePart(accessibleDescription, { name: "", jsonPath: [], op: options.descriptionOp || "=", value: options.description, caseSensitive: !!options.descriptionExact }))\n return;\n }\n result.push(element);\n };\n const query = (root) => {\n const shadows = [];\n if (root.shadowRoot)\n shadows.push(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n match(element);\n if (element.shadowRoot)\n shadows.push(element.shadowRoot);\n }\n shadows.forEach(query);\n };\n query(scope);\n return result;\n}\nfunction createRoleEngine(internal) {\n return {\n queryAll: (scope, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n const role = parsed.name.toLowerCase();\n if (!role)\n throw new Error(`Role must not be empty`);\n const options = validateAttributes(parsed.attributes, role);\n beginAriaCaches();\n try {\n return queryRole(scope, options, internal);\n } finally {\n endAriaCaches();\n }\n }\n };\n}\n\n// packages/injected/src/selectorEvaluator.ts\nvar SelectorEvaluatorImpl = class {\n constructor() {\n this._retainCacheCounter = 0;\n this._cacheText = /* @__PURE__ */ new Map();\n this._cacheQueryCSS = /* @__PURE__ */ new Map();\n this._cacheMatches = /* @__PURE__ */ new Map();\n this._cacheQuery = /* @__PURE__ */ new Map();\n this._cacheMatchesSimple = /* @__PURE__ */ new Map();\n this._cacheMatchesParents = /* @__PURE__ */ new Map();\n this._cacheCallMatches = /* @__PURE__ */ new Map();\n this._cacheCallQuery = /* @__PURE__ */ new Map();\n this._cacheQuerySimple = /* @__PURE__ */ new Map();\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("not", notEngine);\n this._engines.set("is", isEngine);\n this._engines.set("where", isEngine);\n this._engines.set("has", hasEngine);\n this._engines.set("scope", scopeEngine);\n this._engines.set("light", lightEngine);\n this._engines.set("visible", visibleEngine);\n this._engines.set("text", textEngine);\n this._engines.set("text-is", textIsEngine);\n this._engines.set("text-matches", textMatchesEngine);\n this._engines.set("has-text", hasTextEngine);\n this._engines.set("right-of", createLayoutEngine("right-of"));\n this._engines.set("left-of", createLayoutEngine("left-of"));\n this._engines.set("above", createLayoutEngine("above"));\n this._engines.set("below", createLayoutEngine("below"));\n this._engines.set("near", createLayoutEngine("near"));\n this._engines.set("nth-match", nthMatchEngine);\n const allNames = [...this._engines.keys()];\n allNames.sort();\n const parserNames = [...customCSSNames];\n parserNames.sort();\n if (allNames.join("|") !== parserNames.join("|"))\n throw new Error(`Please keep customCSSNames in sync with evaluator engines: ${allNames.join("|")} vs ${parserNames.join("|")}`);\n }\n begin() {\n ++this._retainCacheCounter;\n }\n end() {\n --this._retainCacheCounter;\n if (!this._retainCacheCounter) {\n this._cacheQueryCSS.clear();\n this._cacheMatches.clear();\n this._cacheQuery.clear();\n this._cacheMatchesSimple.clear();\n this._cacheMatchesParents.clear();\n this._cacheCallMatches.clear();\n this._cacheCallQuery.clear();\n this._cacheQuerySimple.clear();\n this._cacheText.clear();\n }\n }\n _cached(cache, main, rest, cb) {\n if (!cache.has(main))\n cache.set(main, []);\n const entries = cache.get(main);\n const entry = entries.find((e) => rest.every((value, index) => e.rest[index] === value));\n if (entry)\n return entry.result;\n const result = cb();\n entries.push({ rest, result });\n return result;\n }\n _checkSelector(s) {\n const wellFormed = typeof s === "object" && s && (Array.isArray(s) || "simples" in s && s.simples.length);\n if (!wellFormed)\n throw new Error(`Malformed selector "${s}"`);\n return s;\n }\n matches(element, s, context) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheMatches, element, [selector, context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._matchesEngine(isEngine, element, selector, context);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n if (!this._matchesSimple(element, selector.simples[selector.simples.length - 1].selector, context))\n return false;\n return this._matchesParents(element, selector, selector.simples.length - 2, context);\n });\n } finally {\n this.end();\n }\n }\n query(context, s) {\n const selector = this._checkSelector(s);\n this.begin();\n try {\n return this._cached(this._cacheQuery, selector, [context.scope, context.pierceShadow, context.originalScope], () => {\n if (Array.isArray(selector))\n return this._queryEngine(isEngine, context, selector);\n if (this._hasScopeClause(selector))\n context = this._expandContextForScopeMatching(context);\n const previousScoreMap = this._scoreMap;\n this._scoreMap = /* @__PURE__ */ new Map();\n let elements = this._querySimple(context, selector.simples[selector.simples.length - 1].selector);\n elements = elements.filter((element) => this._matchesParents(element, selector, selector.simples.length - 2, context));\n if (this._scoreMap.size) {\n elements.sort((a, b) => {\n const aScore = this._scoreMap.get(a);\n const bScore = this._scoreMap.get(b);\n if (aScore === bScore)\n return 0;\n if (aScore === void 0)\n return 1;\n if (bScore === void 0)\n return -1;\n return aScore - bScore;\n });\n }\n this._scoreMap = previousScoreMap;\n return elements;\n });\n } finally {\n this.end();\n }\n }\n _markScore(element, score) {\n if (this._scoreMap)\n this._scoreMap.set(element, score);\n }\n _hasScopeClause(selector) {\n return selector.simples.some((simple) => simple.selector.functions.some((f) => f.name === "scope"));\n }\n _expandContextForScopeMatching(context) {\n if (context.scope.nodeType !== 1)\n return context;\n const scope = parentElementOrShadowHost(context.scope);\n if (!scope)\n return context;\n return { ...context, scope, originalScope: context.originalScope || context.scope };\n }\n _matchesSimple(element, simple, context) {\n return this._cached(this._cacheMatchesSimple, element, [simple, context.scope, context.pierceShadow, context.originalScope], () => {\n if (element === context.scope)\n return false;\n if (simple.css && !this._matchesCSS(element, simple.css))\n return false;\n for (const func of simple.functions) {\n if (!this._matchesEngine(this._getEngine(func.name), element, func.args, context))\n return false;\n }\n return true;\n });\n }\n _querySimple(context, simple) {\n if (!simple.functions.length)\n return this._queryCSS(context, simple.css || "*");\n return this._cached(this._cacheQuerySimple, simple, [context.scope, context.pierceShadow, context.originalScope], () => {\n let css = simple.css;\n const funcs = simple.functions;\n if (css === "*" && funcs.length)\n css = void 0;\n let elements;\n let firstIndex = -1;\n if (css !== void 0) {\n elements = this._queryCSS(context, css);\n } else {\n firstIndex = funcs.findIndex((func) => this._getEngine(func.name).query !== void 0);\n if (firstIndex === -1)\n firstIndex = 0;\n elements = this._queryEngine(this._getEngine(funcs[firstIndex].name), context, funcs[firstIndex].args);\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches !== void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n for (let i = 0; i < funcs.length; i++) {\n if (i === firstIndex)\n continue;\n const engine = this._getEngine(funcs[i].name);\n if (engine.matches === void 0)\n elements = elements.filter((e) => this._matchesEngine(engine, e, funcs[i].args, context));\n }\n return elements;\n });\n }\n _matchesParents(element, complex, index, context) {\n if (index < 0)\n return true;\n return this._cached(this._cacheMatchesParents, element, [complex, index, context.scope, context.pierceShadow, context.originalScope], () => {\n const { selector: simple, combinator } = complex.simples[index];\n if (combinator === ">") {\n const parent = parentElementOrShadowHostInContext(element, context);\n if (!parent || !this._matchesSimple(parent, simple, context))\n return false;\n return this._matchesParents(parent, complex, index - 1, context);\n }\n if (combinator === "+") {\n const previousSibling = previousSiblingInContext(element, context);\n if (!previousSibling || !this._matchesSimple(previousSibling, simple, context))\n return false;\n return this._matchesParents(previousSibling, complex, index - 1, context);\n }\n if (combinator === "") {\n let parent = parentElementOrShadowHostInContext(element, context);\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n if (combinator === "~") {\n let previousSibling = previousSiblingInContext(element, context);\n while (previousSibling) {\n if (this._matchesSimple(previousSibling, simple, context)) {\n if (this._matchesParents(previousSibling, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "~")\n break;\n }\n previousSibling = previousSiblingInContext(previousSibling, context);\n }\n return false;\n }\n if (combinator === ">=") {\n let parent = element;\n while (parent) {\n if (this._matchesSimple(parent, simple, context)) {\n if (this._matchesParents(parent, complex, index - 1, context))\n return true;\n if (complex.simples[index - 1].combinator === "")\n break;\n }\n parent = parentElementOrShadowHostInContext(parent, context);\n }\n return false;\n }\n throw new Error(`Unsupported combinator "${combinator}"`);\n });\n }\n _matchesEngine(engine, element, args, context) {\n if (engine.matches)\n return this._callMatches(engine, element, args, context);\n if (engine.query)\n return this._callQuery(engine, args, context).includes(element);\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _queryEngine(engine, context, args) {\n if (engine.query)\n return this._callQuery(engine, args, context);\n if (engine.matches)\n return this._queryCSS(context, "*").filter((element) => this._callMatches(engine, element, args, context));\n throw new Error(`Selector engine should implement "matches" or "query"`);\n }\n _callMatches(engine, element, args, context) {\n return this._cached(this._cacheCallMatches, element, [engine, context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.matches(element, args, context, this);\n });\n }\n _callQuery(engine, args, context) {\n return this._cached(this._cacheCallQuery, engine, [context.scope, context.pierceShadow, context.originalScope, ...args], () => {\n return engine.query(context, args, this);\n });\n }\n _matchesCSS(element, css) {\n return element.matches(css);\n }\n _queryCSS(context, css) {\n return this._cached(this._cacheQueryCSS, css, [context.scope, context.pierceShadow, context.originalScope], () => {\n let result = [];\n function query(root) {\n result = result.concat([...root.querySelectorAll(css)]);\n if (!context.pierceShadow)\n return;\n if (root.shadowRoot)\n query(root.shadowRoot);\n for (const element of root.querySelectorAll("*")) {\n if (element.shadowRoot)\n query(element.shadowRoot);\n }\n }\n query(context.scope);\n return result;\n });\n }\n _getEngine(name) {\n const engine = this._engines.get(name);\n if (!engine)\n throw new Error(`Unknown selector engine "${name}"`);\n return engine;\n }\n};\nvar isEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n return args.some((selector) => evaluator.matches(element, selector, context));\n },\n query(context, args, evaluator) {\n if (args.length === 0)\n throw new Error(`"is" engine expects non-empty selector list`);\n let elements = [];\n for (const arg of args)\n elements = elements.concat(evaluator.query(context, arg));\n return args.length === 1 ? elements : sortInDOMOrder(elements);\n }\n};\nvar hasEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"has" engine expects non-empty selector list`);\n return evaluator.query({ ...context, scope: element }, args).length > 0;\n }\n // TODO: we can implement efficient "query" by matching "args" and returning\n // all parents/descendants, just have to be careful with the ":scope" matching.\n};\nvar scopeEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9)\n return element === actualScope.documentElement;\n return element === actualScope;\n },\n query(context, args, evaluator) {\n if (args.length !== 0)\n throw new Error(`"scope" engine expects no arguments`);\n const actualScope = context.originalScope || context.scope;\n if (actualScope.nodeType === 9) {\n const root = actualScope.documentElement;\n return root ? [root] : [];\n }\n if (actualScope.nodeType === 1)\n return [actualScope];\n return [];\n }\n};\nvar notEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0)\n throw new Error(`"not" engine expects non-empty selector list`);\n return !evaluator.matches(element, args, context);\n }\n};\nvar lightEngine = {\n query(context, args, evaluator) {\n return evaluator.query({ ...context, pierceShadow: false }, args);\n },\n matches(element, args, context, evaluator) {\n return evaluator.matches(element, args, { ...context, pierceShadow: false });\n }\n};\nvar visibleEngine = {\n matches(element, args, context, evaluator) {\n if (args.length)\n throw new Error(`"visible" engine expects no arguments`);\n return isElementVisible(element);\n }\n};\nvar textEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar textIsEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"text-is" engine expects a single string`);\n const text = normalizeWhiteSpace(args[0]);\n const matcher = (elementText2) => {\n if (!text && !elementText2.immediate.length)\n return true;\n return elementText2.immediate.some((s) => normalizeWhiteSpace(s) === text);\n };\n return elementMatchesText(evaluator._cacheText, element, matcher) !== "none";\n }\n};\nvar textMatchesEngine = {\n matches(element, args, context, evaluator) {\n if (args.length === 0 || typeof args[0] !== "string" || args.length > 2 || args.length === 2 && typeof args[1] !== "string")\n throw new Error(`"text-matches" engine expects a regexp body and optional regexp flags`);\n const re = new RegExp(args[0], args.length === 2 ? args[1] : void 0);\n const matcher = (elementText2) => re.test(elementText2.full);\n return elementMatchesText(evaluator._cacheText, element, matcher) === "self";\n }\n};\nvar hasTextEngine = {\n matches(element, args, context, evaluator) {\n if (args.length !== 1 || typeof args[0] !== "string")\n throw new Error(`"has-text" engine expects a single string`);\n if (shouldSkipForTextMatching(element))\n return false;\n const text = normalizeWhiteSpace(args[0]).toLowerCase();\n const matcher = (elementText2) => elementText2.normalized.toLowerCase().includes(text);\n return matcher(elementText(evaluator._cacheText, element));\n }\n};\nfunction createLayoutEngine(name) {\n return {\n matches(element, args, context, evaluator) {\n const maxDistance = args.length && typeof args[args.length - 1] === "number" ? args[args.length - 1] : void 0;\n const queryArgs = maxDistance === void 0 ? args : args.slice(0, args.length - 1);\n if (args.length < 1 + (maxDistance === void 0 ? 0 : 1))\n throw new Error(`"${name}" engine expects a selector list and optional maximum distance in pixels`);\n const inner = evaluator.query(context, queryArgs);\n const score = layoutSelectorScore(name, element, inner, maxDistance);\n if (score === void 0)\n return false;\n evaluator._markScore(element, score);\n return true;\n }\n };\n}\nvar nthMatchEngine = {\n query(context, args, evaluator) {\n let index = args[args.length - 1];\n if (args.length < 2)\n throw new Error(`"nth-match" engine expects non-empty selector list and an index argument`);\n if (typeof index !== "number" || index < 1)\n throw new Error(`"nth-match" engine expects a one-based index as the last argument`);\n const elements = isEngine.query(context, args.slice(0, args.length - 1), evaluator);\n index--;\n return index < elements.length ? [elements[index]] : [];\n }\n};\nfunction parentElementOrShadowHostInContext(element, context) {\n if (element === context.scope)\n return;\n if (!context.pierceShadow)\n return element.parentElement || void 0;\n return parentElementOrShadowHost(element);\n}\nfunction previousSiblingInContext(element, context) {\n if (element === context.scope)\n return;\n return element.previousElementSibling || void 0;\n}\nfunction sortInDOMOrder(elements) {\n const elementToEntry = /* @__PURE__ */ new Map();\n const roots = [];\n const result = [];\n function append(element) {\n let entry = elementToEntry.get(element);\n if (entry)\n return entry;\n const parent = parentElementOrShadowHost(element);\n if (parent) {\n const parentEntry = append(parent);\n parentEntry.children.push(element);\n } else {\n roots.push(element);\n }\n entry = { children: [], taken: false };\n elementToEntry.set(element, entry);\n return entry;\n }\n for (const e of elements)\n append(e).taken = true;\n function visit(element) {\n const entry = elementToEntry.get(element);\n if (entry.taken)\n result.push(element);\n if (entry.children.length > 1) {\n const set = new Set(entry.children);\n entry.children = [];\n let child = element.firstElementChild;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n child = element.shadowRoot ? element.shadowRoot.firstElementChild : null;\n while (child && entry.children.length < set.size) {\n if (set.has(child))\n entry.children.push(child);\n child = child.nextElementSibling;\n }\n }\n entry.children.forEach(visit);\n }\n roots.forEach(visit);\n return result;\n}\n\n// packages/injected/src/selectorGenerator.ts\nvar kTextScoreRange = 10;\nvar kExactPenalty = kTextScoreRange / 2;\nvar kTestIdScore = 1;\nvar kOtherTestIdScore = 2;\nvar kIframeByAttributeScore = 10;\nvar kBeginPenalizedScore = 50;\nvar kRoleWithNameScore = 100;\nvar kPlaceholderScore = 120;\nvar kLabelScore = 140;\nvar kAltTextScore = 160;\nvar kTextScore = 180;\nvar kTitleScore = 200;\nvar kTextScoreRegex = 250;\nvar kPlaceholderScoreExact = kPlaceholderScore + kExactPenalty;\nvar kLabelScoreExact = kLabelScore + kExactPenalty;\nvar kRoleWithNameScoreExact = kRoleWithNameScore + kExactPenalty;\nvar kAltTextScoreExact = kAltTextScore + kExactPenalty;\nvar kTextScoreExact = kTextScore + kExactPenalty;\nvar kTitleScoreExact = kTitleScore + kExactPenalty;\nvar kEndPenalizedScore = 300;\nvar kCSSIdScore = 500;\nvar kRoleWithoutNameScore = 510;\nvar kCSSInputTypeNameScore = 520;\nvar kCSSTagNameScore = 530;\nvar kNthScore = 1e4;\nvar kCSSFallbackScore = 1e7;\nvar kScoreThresholdForTextExpect = 1e3;\nfunction generateSelector(injectedScript, targetElement, options) {\n var _a;\n injectedScript._evaluator.begin();\n const cache = { allowText: /* @__PURE__ */ new Map(), disallowText: /* @__PURE__ */ new Map() };\n beginAriaCaches();\n beginDOMCaches();\n try {\n let selectors = [];\n if (options.forTextExpect) {\n let targetTokens = cssFallback(injectedScript, targetElement.ownerDocument.documentElement, options);\n for (let element = targetElement; element; element = parentElementOrShadowHost(element)) {\n const tokens = generateSelectorFor(cache, injectedScript, element, { ...options, noText: true });\n if (!tokens)\n continue;\n const score = combineScores(tokens);\n if (score <= kScoreThresholdForTextExpect) {\n targetTokens = tokens;\n break;\n }\n }\n selectors = [joinTokens(targetTokens)];\n } else {\n if (!targetElement.matches("input,textarea,select") && !targetElement.isContentEditable) {\n const interactiveParent = closestCrossShadow(targetElement, "button,select,input,[role=button],[role=checkbox],[role=radio],a,[role=link]", options.root);\n if (interactiveParent && isElementVisible(interactiveParent))\n targetElement = interactiveParent;\n }\n if (options.multiple) {\n const withText = generateSelectorFor(cache, injectedScript, targetElement, options);\n const withoutText = generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true });\n let tokens = [withText, withoutText];\n cache.allowText.clear();\n cache.disallowText.clear();\n if (withText && hasCSSIdToken(withText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noCSSId: true }));\n if (withoutText && hasCSSIdToken(withoutText))\n tokens.push(generateSelectorFor(cache, injectedScript, targetElement, { ...options, noText: true, noCSSId: true }));\n tokens = tokens.filter(Boolean);\n if (!tokens.length) {\n const css = cssFallback(injectedScript, targetElement, options);\n tokens.push(css);\n if (hasCSSIdToken(css))\n tokens.push(cssFallback(injectedScript, targetElement, { ...options, noCSSId: true }));\n }\n selectors = [...new Set(tokens.map((t) => joinTokens(t)))];\n } else {\n const targetTokens = generateSelectorFor(cache, injectedScript, targetElement, options) || cssFallback(injectedScript, targetElement, options);\n selectors = [joinTokens(targetTokens)];\n }\n }\n const selector = selectors[0];\n const parsedSelector = injectedScript.parseSelector(selector);\n return {\n selector,\n selectors,\n elements: injectedScript.querySelectorAll(parsedSelector, (_a = options.root) != null ? _a : targetElement.ownerDocument)\n };\n } finally {\n endDOMCaches();\n endAriaCaches();\n injectedScript._evaluator.end();\n }\n}\nfunction generateSelectorFor(cache, injectedScript, targetElement, options) {\n var _a;\n if (options.root && !isInsideScope(options.root, targetElement))\n throw new Error(`Target element must belong to the root\'s subtree`);\n if (targetElement === options.root)\n return [{ engine: "css", selector: ":scope", score: 1 }];\n if (targetElement.ownerDocument.documentElement === targetElement)\n return [{ engine: "css", selector: "html", score: 1 }];\n let result = null;\n const updateResult = (candidate) => {\n if (!result || combineScores(candidate) < combineScores(result))\n result = candidate;\n };\n const candidates = [];\n if (!options.noText) {\n for (const candidate of buildTextCandidates(injectedScript, targetElement, !options.isRecursive))\n candidates.push({ candidate, isTextCandidate: true });\n }\n for (const token of buildNoTextCandidates(injectedScript, targetElement, options)) {\n if (options.omitInternalEngines && token.engine.startsWith("internal:"))\n continue;\n candidates.push({ candidate: [token], isTextCandidate: false });\n }\n candidates.sort((a, b) => combineScores(a.candidate) - combineScores(b.candidate));\n for (const { candidate, isTextCandidate } of candidates) {\n const elements = injectedScript.querySelectorAll(injectedScript.parseSelector(joinTokens(candidate)), (_a = options.root) != null ? _a : targetElement.ownerDocument);\n if (!elements.includes(targetElement)) {\n continue;\n }\n if (elements.length === 1) {\n updateResult(candidate);\n break;\n }\n const index = elements.indexOf(targetElement);\n if (index > 5) {\n continue;\n }\n updateResult([...candidate, { engine: "nth", selector: String(index), score: kNthScore }]);\n if (options.isRecursive) {\n continue;\n }\n for (let parent = parentElementOrShadowHost(targetElement); parent && parent !== options.root; parent = parentElementOrShadowHost(parent)) {\n const filtered = elements.filter((e) => isInsideScope(parent, e) && e !== parent);\n const newIndex = filtered.indexOf(targetElement);\n if (filtered.length > 5 || newIndex === -1 || newIndex === index && filtered.length > 1) {\n continue;\n }\n const inParent = filtered.length === 1 ? candidate : [...candidate, { engine: "nth", selector: String(newIndex), score: kNthScore }];\n const idealSelectorForParent = { engine: "", selector: "", score: 1 };\n if (result && combineScores([idealSelectorForParent, ...inParent]) >= combineScores(result)) {\n continue;\n }\n const noText = !!options.noText || isTextCandidate;\n const cacheMap = noText ? cache.disallowText : cache.allowText;\n let parentTokens = cacheMap.get(parent);\n if (parentTokens === void 0) {\n parentTokens = generateSelectorFor(cache, injectedScript, parent, { ...options, isRecursive: true, noText }) || cssFallback(injectedScript, parent, options);\n cacheMap.set(parent, parentTokens);\n }\n if (!parentTokens)\n continue;\n updateResult([...parentTokens, ...inParent]);\n }\n }\n return result;\n}\nfunction buildNoTextCandidates(injectedScript, element, options) {\n const candidates = [];\n const testIdAttributeNames = splitTestIdAttributeNames(options.testIdAttributeName);\n {\n for (const attr of ["data-testid", "data-test-id", "data-test"]) {\n if (!testIdAttributeNames.includes(attr) && element.getAttribute(attr))\n candidates.push({ engine: "css", selector: `[${attr}=${quoteCSSAttributeValue(element.getAttribute(attr))}]`, score: kOtherTestIdScore });\n }\n if (!options.noCSSId) {\n const idAttr = element.getAttribute("id");\n if (idAttr && !isGuidLike(idAttr))\n candidates.push({ engine: "css", selector: makeSelectorForId(idAttr), score: kCSSIdScore });\n }\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore });\n }\n if (element.nodeName === "IFRAME" || element.nodeName === "FRAME") {\n for (const attribute of ["name", "title"]) {\n if (element.getAttribute(attribute))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[${attribute}=${quoteCSSAttributeValue(element.getAttribute(attribute))}]`, score: kIframeByAttributeScore });\n }\n for (const testIdAttr of testIdAttributeNames) {\n if (element.getAttribute(testIdAttr))\n candidates.push({ engine: "css", selector: `[${testIdAttr}=${quoteCSSAttributeValue(element.getAttribute(testIdAttr))}]`, score: kTestIdScore });\n }\n penalizeScoreForLength([candidates]);\n return candidates;\n }\n for (const testIdAttr of testIdAttributeNames) {\n if (element.getAttribute(testIdAttr))\n candidates.push({ engine: "internal:testid", selector: `[${testIdAttr}=${escapeForAttributeSelector(element.getAttribute(testIdAttr), true)}]`, score: kTestIdScore });\n }\n if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {\n const input = element;\n if (input.placeholder) {\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(input.placeholder, true)}]`, score: kPlaceholderScoreExact });\n for (const alternative of suitableTextAlternatives(input.placeholder))\n candidates.push({ engine: "internal:attr", selector: `[placeholder=${escapeForAttributeSelector(alternative.text, false)}]`, score: kPlaceholderScore - alternative.scoreBonus });\n }\n }\n const labels = getElementLabels(injectedScript._evaluator._cacheText, element);\n for (const label of labels) {\n const labelText = label.normalized;\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(labelText, true), score: kLabelScoreExact });\n for (const alternative of suitableTextAlternatives(labelText))\n candidates.push({ engine: "internal:label", selector: escapeForTextSelector(alternative.text, false), score: kLabelScore - alternative.scoreBonus });\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole))\n candidates.push({ engine: "internal:role", selector: ariaRole, score: kRoleWithoutNameScore });\n if (element.getAttribute("name") && ["BUTTON", "FORM", "FIELDSET", "FRAME", "IFRAME", "INPUT", "KEYGEN", "OBJECT", "OUTPUT", "SELECT", "TEXTAREA", "MAP", "META", "PARAM"].includes(element.nodeName))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[name=${quoteCSSAttributeValue(element.getAttribute("name"))}]`, score: kCSSInputTypeNameScore });\n if (["INPUT", "TEXTAREA"].includes(element.nodeName) && element.getAttribute("type") !== "hidden") {\n if (element.getAttribute("type"))\n candidates.push({ engine: "css", selector: `${escapeNodeName(element)}[type=${quoteCSSAttributeValue(element.getAttribute("type"))}]`, score: kCSSInputTypeNameScore });\n }\n if (["INPUT", "TEXTAREA", "SELECT"].includes(element.nodeName) && element.getAttribute("type") !== "hidden")\n candidates.push({ engine: "css", selector: escapeNodeName(element), score: kCSSInputTypeNameScore + 1 });\n penalizeScoreForLength([candidates]);\n return candidates;\n}\nfunction buildTextCandidates(injectedScript, element, isTargetNode) {\n if (element.nodeName === "SELECT")\n return [];\n const candidates = [];\n const title = element.getAttribute("title");\n if (title) {\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(title, true)}]`, score: kTitleScoreExact }]);\n for (const alternative of suitableTextAlternatives(title))\n candidates.push([{ engine: "internal:attr", selector: `[title=${escapeForAttributeSelector(alternative.text, false)}]`, score: kTitleScore - alternative.scoreBonus }]);\n }\n const alt = element.getAttribute("alt");\n if (alt && ["APPLET", "AREA", "IMG", "INPUT"].includes(element.nodeName)) {\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alt, true)}]`, score: kAltTextScoreExact }]);\n for (const alternative of suitableTextAlternatives(alt))\n candidates.push([{ engine: "internal:attr", selector: `[alt=${escapeForAttributeSelector(alternative.text, false)}]`, score: kAltTextScore - alternative.scoreBonus }]);\n }\n const text = elementText(injectedScript._evaluator._cacheText, element).normalized;\n const textAlternatives = text ? suitableTextAlternatives(text) : [];\n if (text) {\n if (isTargetNode) {\n if (text.length <= 80)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(text, true), score: kTextScoreExact }]);\n for (const alternative of textAlternatives)\n candidates.push([{ engine: "internal:text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n }\n const cssToken = { engine: "css", selector: escapeNodeName(element), score: kCSSTagNameScore };\n for (const alternative of textAlternatives)\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (isTargetNode && text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([cssToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n const ariaRole = getAriaRole(element);\n if (ariaRole && !["none", "presentation"].includes(ariaRole)) {\n const ariaName = getElementAccessibleNameText(element, false);\n if (ariaName && !ariaName.match(/^\\p{Co}+$/u)) {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(ariaName, true)}]`, score: kRoleWithNameScoreExact };\n candidates.push([roleToken]);\n for (const alternative of suitableTextAlternatives(ariaName))\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(alternative.text, false)}]`, score: kRoleWithNameScore - alternative.scoreBonus }]);\n const ariaDescription = getElementAccessibleDescription(element, false);\n if (ariaDescription) {\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(ariaName, true)}][description=${escapeForAttributeSelector(ariaDescription, true)}]`, score: kRoleWithNameScoreExact + 1 }]);\n for (const alternative of suitableTextAlternatives(ariaName))\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[name=${escapeForAttributeSelector(alternative.text, false)}][description=${escapeForAttributeSelector(ariaDescription, false)}]`, score: kRoleWithNameScore - alternative.scoreBonus + 1 }]);\n }\n } else {\n const roleToken = { engine: "internal:role", selector: `${ariaRole}`, score: kRoleWithoutNameScore };\n const ariaDescription = getElementAccessibleDescription(element, false);\n if (ariaDescription)\n candidates.push([{ engine: "internal:role", selector: `${ariaRole}[description=${escapeForAttributeSelector(ariaDescription, true)}]`, score: kRoleWithoutNameScore + 1 }]);\n for (const alternative of textAlternatives)\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(alternative.text, false), score: kTextScore - alternative.scoreBonus }]);\n if (isTargetNode && text.length <= 80) {\n const re = new RegExp("^" + escapeRegExp(text) + "$");\n candidates.push([roleToken, { engine: "internal:has-text", selector: escapeForTextSelector(re, false), score: kTextScoreRegex }]);\n }\n }\n }\n penalizeScoreForLength(candidates);\n return candidates;\n}\nfunction makeSelectorForId(id) {\n return /^[a-zA-Z][a-zA-Z0-9\\-\\_]+$/.test(id) ? "#" + id : `[id=${quoteCSSAttributeValue(id)}]`;\n}\nfunction hasCSSIdToken(tokens) {\n return tokens.some((token) => token.engine === "css" && (token.selector.startsWith("#") || token.selector.startsWith(\'[id="\')));\n}\nfunction cssFallback(injectedScript, targetElement, options) {\n var _a;\n const root = (_a = options.root) != null ? _a : targetElement.ownerDocument;\n const tokens = [];\n function uniqueCSSSelector(prefix) {\n const path = tokens.slice();\n if (prefix)\n path.unshift(prefix);\n const selector = path.join(" > ");\n const parsedSelector = injectedScript.parseSelector(selector);\n const node = injectedScript.querySelector(parsedSelector, root, false);\n return node === targetElement ? selector : void 0;\n }\n function makeStrict(selector) {\n const token = { engine: "css", selector, score: kCSSFallbackScore };\n const parsedSelector = injectedScript.parseSelector(selector);\n const elements = injectedScript.querySelectorAll(parsedSelector, root);\n if (elements.length === 1)\n return [token];\n const nth = { engine: "nth", selector: String(elements.indexOf(targetElement)), score: kNthScore };\n return [token, nth];\n }\n for (let element = targetElement; element && element !== root; element = parentElementOrShadowHost(element)) {\n let bestTokenForLevel = "";\n if (element.id && !options.noCSSId) {\n const token = makeSelectorForId(element.id);\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n bestTokenForLevel = token;\n }\n const parent = element.parentNode;\n const classes = [...element.classList].map(escapeClassName);\n for (let i = 0; i < classes.length; ++i) {\n const token = "." + classes.slice(0, i + 1).join(".");\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel && parent) {\n const sameClassSiblings = parent.querySelectorAll(token);\n if (sameClassSiblings.length === 1)\n bestTokenForLevel = token;\n }\n }\n if (parent) {\n const siblings = [...parent.children];\n const nodeName = element.nodeName;\n const sameTagSiblings = siblings.filter((sibling) => sibling.nodeName === nodeName);\n const token = sameTagSiblings.indexOf(element) === 0 ? escapeNodeName(element) : `${escapeNodeName(element)}:nth-child(${1 + siblings.indexOf(element)})`;\n const selector = uniqueCSSSelector(token);\n if (selector)\n return makeStrict(selector);\n if (!bestTokenForLevel)\n bestTokenForLevel = token;\n } else if (!bestTokenForLevel) {\n bestTokenForLevel = escapeNodeName(element);\n }\n tokens.unshift(bestTokenForLevel);\n }\n return makeStrict(uniqueCSSSelector());\n}\nfunction penalizeScoreForLength(groups) {\n for (const group of groups) {\n for (const token of group) {\n if (token.score > kBeginPenalizedScore && token.score < kEndPenalizedScore)\n token.score += Math.min(kTextScoreRange, token.selector.length / 10 | 0);\n }\n }\n}\nfunction joinTokens(tokens) {\n const parts = [];\n let lastEngine = "";\n for (const { engine, selector } of tokens) {\n if (parts.length && (lastEngine !== "css" || engine !== "css" || selector.startsWith(":nth-match(")))\n parts.push(">>");\n lastEngine = engine;\n if (engine === "css")\n parts.push(selector);\n else\n parts.push(`${engine}=${selector}`);\n }\n return parts.join(" ");\n}\nfunction combineScores(tokens) {\n let score = 0;\n for (let i = 0; i < tokens.length; i++)\n score += tokens[i].score * (tokens.length - i);\n return score;\n}\nfunction isGuidLike(id) {\n let lastCharacterType;\n let transitionCount = 0;\n for (let i = 0; i < id.length; ++i) {\n const c = id[i];\n let characterType;\n if (c === "-" || c === "_")\n continue;\n if (c >= "a" && c <= "z")\n characterType = "lower";\n else if (c >= "A" && c <= "Z")\n characterType = "upper";\n else if (c >= "0" && c <= "9")\n characterType = "digit";\n else\n characterType = "other";\n if (characterType === "lower" && lastCharacterType === "upper") {\n lastCharacterType = characterType;\n continue;\n }\n if (lastCharacterType && lastCharacterType !== characterType)\n ++transitionCount;\n lastCharacterType = characterType;\n }\n return transitionCount >= id.length / 4;\n}\nfunction trimWordBoundary(text, maxLength) {\n if (text.length <= maxLength)\n return text;\n text = text.substring(0, maxLength);\n const match = text.match(/^(.*)\\b(.+?)$/);\n if (!match)\n return "";\n return match[1].trimEnd();\n}\nfunction suitableTextAlternatives(text) {\n let result = [];\n {\n const match = text.match(/^([\\d.,]+)[^.,\\w]/);\n const leadingNumberLength = match ? match[1].length : 0;\n if (leadingNumberLength) {\n const alt = trimWordBoundary(text.substring(leadingNumberLength).trimStart(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n {\n const match = text.match(/[^.,\\w]([\\d.,]+)$/);\n const trailingNumberLength = match ? match[1].length : 0;\n if (trailingNumberLength) {\n const alt = trimWordBoundary(text.substring(0, text.length - trailingNumberLength).trimEnd(), 80);\n result.push({ text: alt, scoreBonus: alt.length <= 30 ? 2 : 1 });\n }\n }\n if (text.length <= 30) {\n result.push({ text, scoreBonus: 0 });\n } else {\n result.push({ text: trimWordBoundary(text, 80), scoreBonus: 0 });\n result.push({ text: trimWordBoundary(text, 30), scoreBonus: 1 });\n }\n result = result.filter((r) => r.text);\n if (!result.length)\n result.push({ text: text.substring(0, 80), scoreBonus: 0 });\n return result;\n}\nfunction escapeNodeName(node) {\n return node.nodeName.toLocaleLowerCase().replace(/[:\\.]/g, (char) => "\\\\" + char);\n}\nfunction escapeClassName(className) {\n let result = "";\n for (let i = 0; i < className.length; i++)\n result += cssEscapeCharacter(className, i);\n return result;\n}\nfunction cssEscapeCharacter(s, i) {\n const c = s.charCodeAt(i);\n if (c === 0)\n return "\\uFFFD";\n if (c >= 1 && c <= 31 || c >= 48 && c <= 57 && (i === 0 || i === 1 && s.charCodeAt(0) === 45))\n return "\\\\" + c.toString(16) + " ";\n if (i === 0 && c === 45 && s.length === 1)\n return "\\\\" + s.charAt(i);\n if (c >= 128 || c === 45 || c === 95 || c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122)\n return s.charAt(i);\n return "\\\\" + s.charAt(i);\n}\n\n// packages/injected/src/xpathSelectorEngine.ts\nvar XPathEngine = {\n queryAll(root, selector) {\n if (selector.startsWith("/") && root.nodeType !== Node.DOCUMENT_NODE)\n selector = "." + selector;\n const result = [];\n const document = root.ownerDocument || root;\n if (!document)\n return result;\n const it = document.evaluate(selector, root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE);\n for (let node = it.iterateNext(); node; node = it.iterateNext()) {\n if (node.nodeType === Node.ELEMENT_NODE)\n result.push(node);\n }\n return result;\n }\n};\n\n// packages/injected/src/consoleApi.ts\nvar selectorSymbol = /* @__PURE__ */ Symbol("selector");\nselectorSymbol;\nvar _Locator = class _Locator {\n constructor(injectedScript, selector, options) {\n if (options == null ? void 0 : options.hasText)\n selector += ` >> internal:has-text=${escapeForTextSelector(options.hasText, false)}`;\n if (options == null ? void 0 : options.hasNotText)\n selector += ` >> internal:has-not-text=${escapeForTextSelector(options.hasNotText, false)}`;\n if (options == null ? void 0 : options.has)\n selector += ` >> internal:has=` + JSON.stringify(options.has[selectorSymbol]);\n if (options == null ? void 0 : options.hasNot)\n selector += ` >> internal:has-not=` + JSON.stringify(options.hasNot[selectorSymbol]);\n if ((options == null ? void 0 : options.visible) !== void 0)\n selector += ` >> visible=${options.visible ? "true" : "false"}`;\n this[selectorSymbol] = selector;\n if (selector) {\n const parsed = injectedScript.parseSelector(selector);\n this.element = injectedScript.querySelector(parsed, injectedScript.document, false);\n this.elements = injectedScript.querySelectorAll(parsed, injectedScript.document);\n }\n const selectorBase = selector;\n const self = this;\n self.locator = (selector2, options2) => {\n return new _Locator(injectedScript, selectorBase ? selectorBase + " >> " + selector2 : selector2, options2);\n };\n self.getByTestId = (testId) => self.locator(getByTestIdSelector(injectedScript.testIdAttributeNameForStrictErrorAndConsoleCodegen(), testId));\n self.getByAltText = (text, options2) => self.locator(getByAltTextSelector(text, options2));\n self.getByLabel = (text, options2) => self.locator(getByLabelSelector(text, options2));\n self.getByPlaceholder = (text, options2) => self.locator(getByPlaceholderSelector(text, options2));\n self.getByText = (text, options2) => self.locator(getByTextSelector(text, options2));\n self.getByTitle = (text, options2) => self.locator(getByTitleSelector(text, options2));\n self.getByRole = (role, options2 = {}) => self.locator(getByRoleSelector(role, options2));\n self.filter = (options2) => new _Locator(injectedScript, selector, options2);\n self.first = () => self.locator("nth=0");\n self.last = () => self.locator("nth=-1");\n self.nth = (index) => self.locator(`nth=${index}`);\n self.and = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:and=` + JSON.stringify(locator[selectorSymbol]));\n self.or = (locator) => new _Locator(injectedScript, selectorBase + ` >> internal:or=` + JSON.stringify(locator[selectorSymbol]));\n }\n};\nvar Locator = _Locator;\nvar ConsoleAPI = class {\n constructor(injectedScript) {\n this._injectedScript = injectedScript;\n }\n install() {\n if (this._injectedScript.window.playwright)\n return;\n this._injectedScript.window.playwright = {\n $: (selector, strict) => this._querySelector(selector, !!strict),\n $$: (selector) => this._querySelectorAll(selector),\n inspect: (selector) => this._inspect(selector),\n selector: (element) => this._selector(element),\n generateLocator: (element, language) => this._generateLocator(element, language),\n ariaSnapshot: (element, options) => {\n return this._injectedScript.ariaSnapshot(element || this._injectedScript.document.body, options || { mode: "default" });\n },\n resume: () => this._resume(),\n ...new Locator(this._injectedScript, "")\n };\n delete this._injectedScript.window.playwright.filter;\n delete this._injectedScript.window.playwright.first;\n delete this._injectedScript.window.playwright.last;\n delete this._injectedScript.window.playwright.nth;\n delete this._injectedScript.window.playwright.and;\n delete this._injectedScript.window.playwright.or;\n }\n _querySelector(selector, strict) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.query(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelector(parsed, this._injectedScript.document, strict);\n }\n _querySelectorAll(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.$$(\'Playwright >> selector\').`);\n const parsed = this._injectedScript.parseSelector(selector);\n return this._injectedScript.querySelectorAll(parsed, this._injectedScript.document);\n }\n _inspect(selector) {\n if (typeof selector !== "string")\n throw new Error(`Usage: playwright.inspect(\'Playwright >> selector\').`);\n this._injectedScript.window.inspect(this._querySelector(selector, false));\n }\n _selector(element) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.selector(element).`);\n return this._injectedScript.generateSelectorSimple(element);\n }\n _generateLocator(element, language) {\n if (!(element instanceof Element))\n throw new Error(`Usage: playwright.locator(element).`);\n const selector = this._injectedScript.generateSelectorSimple(element);\n return asLocator(language || "javascript", selector);\n }\n _resume() {\n if (!this._injectedScript.window.__pw_resume)\n return false;\n this._injectedScript.window.__pw_resume().catch(() => {\n });\n }\n};\n\n// packages/isomorphic/utilityScriptSerializers.ts\nvar kFunctionBindingPrefix = "__pw_fn_";\nvar kBindingsControllerProperty = "__playwright__binding__controller__";\nfunction isRegExp2(obj) {\n try {\n return obj instanceof RegExp || Object.prototype.toString.call(obj) === "[object RegExp]";\n } catch (error) {\n return false;\n }\n}\nfunction isDate(obj) {\n try {\n return obj instanceof Date || Object.prototype.toString.call(obj) === "[object Date]";\n } catch (error) {\n return false;\n }\n}\nfunction isURL(obj) {\n try {\n return obj instanceof URL || Object.prototype.toString.call(obj) === "[object URL]";\n } catch (error) {\n return false;\n }\n}\nfunction isError(obj) {\n var _a;\n try {\n return obj instanceof Error || obj && ((_a = Object.getPrototypeOf(obj)) == null ? void 0 : _a.name) === "Error";\n } catch (error) {\n return false;\n }\n}\nfunction isTypedArray(obj, constructor) {\n try {\n return obj instanceof constructor || Object.prototype.toString.call(obj) === `[object ${constructor.name}]`;\n } catch (error) {\n return false;\n }\n}\nfunction isArrayBuffer(obj) {\n try {\n return obj instanceof ArrayBuffer || Object.prototype.toString.call(obj) === "[object ArrayBuffer]";\n } catch (error) {\n return false;\n }\n}\nvar typedArrayConstructors = {\n i8: Int8Array,\n ui8: Uint8Array,\n ui8c: Uint8ClampedArray,\n i16: Int16Array,\n ui16: Uint16Array,\n i32: Int32Array,\n ui32: Uint32Array,\n // TODO: add Float16Array once it\'s in baseline\n f32: Float32Array,\n f64: Float64Array,\n bi64: BigInt64Array,\n bui64: BigUint64Array\n};\nfunction typedArrayToBase64(array) {\n if ("toBase64" in array)\n return array.toBase64();\n const binary = Array.from(new Uint8Array(array.buffer, array.byteOffset, array.byteLength)).map((b) => String.fromCharCode(b)).join("");\n return btoa(binary);\n}\nfunction base64ToTypedArray(base64, TypedArrayConstructor) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++)\n bytes[i] = binary.charCodeAt(i);\n return new TypedArrayConstructor(bytes.buffer);\n}\nfunction parseEvaluationResultValue(value, handles = [], refs = /* @__PURE__ */ new Map()) {\n if (Object.is(value, void 0))\n return void 0;\n if (typeof value === "object" && value) {\n if ("ref" in value)\n return refs.get(value.ref);\n if ("v" in value) {\n if (value.v === "undefined")\n return void 0;\n if (value.v === "null")\n return null;\n if (value.v === "NaN")\n return NaN;\n if (value.v === "Infinity")\n return Infinity;\n if (value.v === "-Infinity")\n return -Infinity;\n if (value.v === "-0")\n return -0;\n return void 0;\n }\n if ("d" in value) {\n return new Date(value.d);\n }\n if ("u" in value)\n return new URL(value.u);\n if ("bi" in value)\n return BigInt(value.bi);\n if ("e" in value) {\n const error = new Error(value.e.m);\n error.name = value.e.n;\n error.stack = value.e.s;\n return error;\n }\n if ("r" in value)\n return new RegExp(value.r.p, value.r.f);\n if ("a" in value) {\n const result = [];\n refs.set(value.id, result);\n for (const a of value.a)\n result.push(parseEvaluationResultValue(a, handles, refs));\n return result;\n }\n if ("o" in value) {\n const result = {};\n refs.set(value.id, result);\n for (const { k, v } of value.o) {\n if (k === "__proto__")\n continue;\n result[k] = parseEvaluationResultValue(v, handles, refs);\n }\n return result;\n }\n if ("h" in value)\n return handles[value.h];\n if ("fn" in value) {\n const name = value.fn;\n return (...args) => globalThis[kBindingsControllerProperty].callBinding(name, ...args);\n }\n if ("ta" in value)\n return base64ToTypedArray(value.ta.b, typedArrayConstructors[value.ta.k]);\n if ("ab" in value)\n return base64ToTypedArray(value.ab.b, Uint8Array).buffer;\n }\n return value;\n}\nfunction serializeAsCallArgument(value, handleSerializer) {\n return serialize(value, handleSerializer, { visited: /* @__PURE__ */ new Map(), lastId: 0 });\n}\nfunction serialize(value, handleSerializer, visitorInfo) {\n if (value && typeof value === "object") {\n if (typeof globalThis.Window === "function" && value instanceof globalThis.Window)\n return "ref: ";\n if (typeof globalThis.Document === "function" && value instanceof globalThis.Document)\n return "ref: ";\n if (typeof globalThis.Node === "function" && value instanceof globalThis.Node)\n return "ref: ";\n }\n return innerSerialize(value, handleSerializer, visitorInfo);\n}\nfunction innerSerialize(value, handleSerializer, visitorInfo) {\n var _a;\n const result = handleSerializer(value);\n if ("fallThrough" in result)\n value = result.fallThrough;\n else\n return result;\n if (typeof value === "symbol")\n return { v: "undefined" };\n if (Object.is(value, void 0))\n return { v: "undefined" };\n if (Object.is(value, null))\n return { v: "null" };\n if (Object.is(value, NaN))\n return { v: "NaN" };\n if (Object.is(value, Infinity))\n return { v: "Infinity" };\n if (Object.is(value, -Infinity))\n return { v: "-Infinity" };\n if (Object.is(value, -0))\n return { v: "-0" };\n if (typeof value === "boolean")\n return value;\n if (typeof value === "number")\n return value;\n if (typeof value === "string")\n return value;\n if (typeof value === "bigint")\n return { bi: value.toString() };\n if (isError(value)) {\n let stack;\n if ((_a = value.stack) == null ? void 0 : _a.startsWith(value.name + ": " + value.message)) {\n stack = value.stack;\n } else {\n stack = `${value.name}: ${value.message}\n${value.stack}`;\n }\n return { e: { n: value.name, m: value.message, s: stack } };\n }\n if (isDate(value))\n return { d: value.toJSON() };\n if (isURL(value))\n return { u: value.toJSON() };\n if (isRegExp2(value))\n return { r: { p: value.source, f: value.flags } };\n for (const [k, ctor] of Object.entries(typedArrayConstructors)) {\n if (isTypedArray(value, ctor))\n return { ta: { b: typedArrayToBase64(value), k } };\n }\n if (isArrayBuffer(value))\n return { ab: { b: typedArrayToBase64(new Uint8Array(value)) } };\n const id = visitorInfo.visited.get(value);\n if (id)\n return { ref: id };\n if (Array.isArray(value)) {\n const a = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (let i = 0; i < value.length; ++i)\n a.push(serialize(value[i], handleSerializer, visitorInfo));\n return { a, id: id2 };\n }\n if (typeof value === "object") {\n const o = [];\n const id2 = ++visitorInfo.lastId;\n visitorInfo.visited.set(value, id2);\n for (const name of Object.keys(value)) {\n let item;\n try {\n item = value[name];\n } catch (e) {\n continue;\n }\n if (name === "toJSON" && typeof item === "function")\n o.push({ k: name, v: { o: [], id: 0 } });\n else\n o.push({ k: name, v: serialize(item, handleSerializer, visitorInfo) });\n }\n let jsonWrapper;\n try {\n if (o.length === 0 && value.toJSON && typeof value.toJSON === "function")\n jsonWrapper = { value: value.toJSON() };\n } catch (e) {\n }\n if (jsonWrapper)\n return innerSerialize(jsonWrapper.value, handleSerializer, visitorInfo);\n return { o, id: id2 };\n }\n if (typeof value === "function" && value.name.startsWith(kFunctionBindingPrefix))\n return { fn: value.name };\n}\n\n// packages/injected/src/utilityScript.ts\nvar UtilityScript = class {\n constructor(global, isUnderTest) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.global = global;\n this.isUnderTest = isUnderTest;\n if (global.__pwClock) {\n this.builtins = global.__pwClock.builtins;\n } else {\n this.builtins = {\n setTimeout: (_a = global.setTimeout) == null ? void 0 : _a.bind(global),\n clearTimeout: (_b = global.clearTimeout) == null ? void 0 : _b.bind(global),\n setInterval: (_c = global.setInterval) == null ? void 0 : _c.bind(global),\n clearInterval: (_d = global.clearInterval) == null ? void 0 : _d.bind(global),\n requestAnimationFrame: (_e = global.requestAnimationFrame) == null ? void 0 : _e.bind(global),\n cancelAnimationFrame: (_f = global.cancelAnimationFrame) == null ? void 0 : _f.bind(global),\n requestIdleCallback: (_g = global.requestIdleCallback) == null ? void 0 : _g.bind(global),\n cancelIdleCallback: (_h = global.cancelIdleCallback) == null ? void 0 : _h.bind(global),\n performance: global.performance,\n Intl: global.Intl,\n Date: global.Date,\n AbortSignal: global.AbortSignal\n };\n }\n if (this.isUnderTest)\n global.builtins = this.builtins;\n }\n evaluate(isFunction, returnByValue, expression, argCount, ...argsAndHandles) {\n const args = argsAndHandles.slice(0, argCount);\n const handles = argsAndHandles.slice(argCount);\n const parameters = [];\n for (let i = 0; i < args.length; i++)\n parameters[i] = parseEvaluationResultValue(args[i], handles);\n let result = this.global.eval(expression);\n if (isFunction === true) {\n result = result(...parameters);\n } else if (isFunction === false) {\n result = result;\n } else {\n if (typeof result === "function")\n result = result(...parameters);\n }\n return returnByValue ? this._promiseAwareJsonValueNoThrow(result) : result;\n }\n jsonValue(returnByValue, value) {\n if (value === void 0)\n return void 0;\n return serializeAsCallArgument(value, (value2) => ({ fallThrough: value2 }));\n }\n _promiseAwareJsonValueNoThrow(value) {\n const safeJson = (value2) => {\n try {\n return this.jsonValue(true, value2);\n } catch (e) {\n return void 0;\n }\n };\n if (value && typeof value === "object" && typeof value.then === "function") {\n return (async () => {\n const promiseValue = await value;\n return safeJson(promiseValue);\n })();\n }\n return safeJson(value);\n }\n};\n\n// packages/injected/src/injectedScript.ts\nvar InjectedScript = class {\n constructor(window, options) {\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = "data-testid";\n // Recorder must use any external dependencies through InjectedScript.\n // Otherwise it will end up with a copy of all modules it uses, and any\n // module-level globals will be duplicated, which leads to subtle bugs.\n this.utils = {\n asLocator,\n cacheNormalizedWhitespaces,\n elementText,\n getAriaRole,\n getElementAccessibleNameText,\n getElementAccessibleDescription,\n isElementVisible,\n isInsideScope,\n normalizeWhiteSpace,\n parseAriaSnapshot,\n generateAriaTree,\n findNewElement,\n // Builtins protect injected code from clock emulation.\n builtins: null\n };\n this.window = window;\n this.document = window.document;\n this.isUnderTest = options.isUnderTest;\n this.utils.builtins = new UtilityScript(window, options.isUnderTest).builtins;\n this._sdkLanguage = options.sdkLanguage;\n this._frameSeq = options.frameSeq;\n this._testIdAttributeNameForStrictErrorAndConsoleCodegen = options.testIdAttributeName;\n this._evaluator = new SelectorEvaluatorImpl();\n this.consoleApi = new ConsoleAPI(this);\n this.onGlobalListenersRemoved = /* @__PURE__ */ new Set();\n this._autoClosingTags = /* @__PURE__ */ new Set(["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "MENUITEM", "META", "PARAM", "SOURCE", "TRACK", "WBR"]);\n this._booleanAttributes = /* @__PURE__ */ new Set(["checked", "selected", "disabled", "readonly", "multiple"]);\n this._eventTypes = /* @__PURE__ */ new Map([\n ["auxclick", "mouse"],\n ["click", "mouse"],\n ["dblclick", "mouse"],\n ["mousedown", "mouse"],\n ["mouseeenter", "mouse"],\n ["mouseleave", "mouse"],\n ["mousemove", "mouse"],\n ["mouseout", "mouse"],\n ["mouseover", "mouse"],\n ["mouseup", "mouse"],\n ["mouseleave", "mouse"],\n ["mousewheel", "mouse"],\n ["keydown", "keyboard"],\n ["keyup", "keyboard"],\n ["keypress", "keyboard"],\n ["textInput", "keyboard"],\n ["touchstart", "touch"],\n ["touchmove", "touch"],\n ["touchend", "touch"],\n ["touchcancel", "touch"],\n ["pointerover", "pointer"],\n ["pointerout", "pointer"],\n ["pointerenter", "pointer"],\n ["pointerleave", "pointer"],\n ["pointerdown", "pointer"],\n ["pointerup", "pointer"],\n ["pointermove", "pointer"],\n ["pointercancel", "pointer"],\n ["gotpointercapture", "pointer"],\n ["lostpointercapture", "pointer"],\n ["focus", "focus"],\n ["blur", "focus"],\n ["drag", "drag"],\n ["dragstart", "drag"],\n ["dragend", "drag"],\n ["dragover", "drag"],\n ["dragenter", "drag"],\n ["dragleave", "drag"],\n ["dragexit", "drag"],\n ["drop", "drag"],\n ["wheel", "wheel"],\n ["deviceorientation", "deviceorientation"],\n ["deviceorientationabsolute", "deviceorientation"],\n ["devicemotion", "devicemotion"]\n ]);\n this._hoverHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousemove"]);\n this._tapHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["pointerdown", "pointerup", "touchstart", "touchend", "touchcancel"]);\n this._mouseHitTargetInterceptorEvents = /* @__PURE__ */ new Set(["mousedown", "mouseup", "pointerdown", "pointerup", "click", "auxclick", "dblclick", "contextmenu"]);\n this._allHitTargetInterceptorEvents = /* @__PURE__ */ new Set([...this._hoverHitTargetInterceptorEvents, ...this._tapHitTargetInterceptorEvents, ...this._mouseHitTargetInterceptorEvents]);\n this._engines = /* @__PURE__ */ new Map();\n this._engines.set("xpath", XPathEngine);\n this._engines.set("xpath:light", XPathEngine);\n this._engines.set("role", createRoleEngine(false));\n this._engines.set("text", this._createTextEngine(true, false));\n this._engines.set("text:light", this._createTextEngine(false, false));\n this._engines.set("id", this._createAttributeEngine("id", true));\n this._engines.set("id:light", this._createAttributeEngine("id", false));\n this._engines.set("data-testid", this._createAttributeEngine("data-testid", true));\n this._engines.set("data-testid:light", this._createAttributeEngine("data-testid", false));\n this._engines.set("data-test-id", this._createAttributeEngine("data-test-id", true));\n this._engines.set("data-test-id:light", this._createAttributeEngine("data-test-id", false));\n this._engines.set("data-test", this._createAttributeEngine("data-test", true));\n this._engines.set("data-test:light", this._createAttributeEngine("data-test", false));\n this._engines.set("css", this._createCSSEngine());\n this._engines.set("nth", { queryAll: () => [] });\n this._engines.set("visible", this._createVisibleEngine());\n this._engines.set("internal:control", this._createControlEngine());\n this._engines.set("internal:has", this._createHasEngine());\n this._engines.set("internal:has-not", this._createHasNotEngine());\n this._engines.set("internal:and", { queryAll: () => [] });\n this._engines.set("internal:or", { queryAll: () => [] });\n this._engines.set("internal:chain", this._createInternalChainEngine());\n this._engines.set("internal:label", this._createInternalLabelEngine());\n this._engines.set("internal:text", this._createTextEngine(true, true));\n this._engines.set("internal:has-text", this._createInternalHasTextEngine());\n this._engines.set("internal:has-not-text", this._createInternalHasNotTextEngine());\n this._engines.set("internal:attr", this._createNamedAttributeEngine());\n this._engines.set("internal:testid", this._createTestIdEngine());\n this._engines.set("internal:role", createRoleEngine(true));\n this._engines.set("internal:describe", this._createDescribeEngine());\n this._engines.set("aria-ref", this._createAriaRefEngine());\n for (const { name, source } of options.customEngines)\n this._engines.set(name, this.eval(source));\n this._stableRafCount = options.stableRafCount;\n this._browserName = options.browserName;\n this._shouldPrependErrorPrefix = !!options.shouldPrependErrorPrefix;\n this._isUtilityWorld = !!options.isUtilityWorld;\n setGlobalOptions({ browserNameForWorkarounds: options.browserName });\n this._setupGlobalListenersRemovalDetection();\n this._setupHitTargetInterceptors();\n if (this.isUnderTest)\n this.window.__injectedScript = this;\n }\n eval(expression) {\n return this.window.eval(expression);\n }\n testIdAttributeNameForStrictErrorAndConsoleCodegen() {\n return this._testIdAttributeNameForStrictErrorAndConsoleCodegen;\n }\n parseSelector(selector) {\n const result = parseSelector(selector);\n visitAllSelectorParts(result, (part) => {\n if (!this._engines.has(part.name))\n throw this.createStacklessError(`Unknown engine "${part.name}" while parsing selector ${selector}`);\n });\n return result;\n }\n generateSelector(targetElement, options) {\n return generateSelector(this, targetElement, options);\n }\n generateSelectorSimple(targetElement, options) {\n return generateSelector(this, targetElement, { ...options, testIdAttributeName: this._testIdAttributeNameForStrictErrorAndConsoleCodegen }).selector;\n }\n querySelector(selector, root, strict) {\n const result = this.querySelectorAll(selector, root);\n if (strict && result.length > 1)\n throw this.strictModeViolationError(selector, result);\n this.checkDeprecatedSelectorUsage(selector, result);\n return result[0];\n }\n _queryNth(elements, part) {\n const list = [...elements];\n let nth = +part.body;\n if (nth === -1)\n nth = list.length - 1;\n return new Set(list.slice(nth, nth + 1));\n }\n _queryLayoutSelector(elements, part, originalRoot) {\n const name = part.name;\n const body = part.body;\n const result = [];\n const inner = this.querySelectorAll(body.parsed, originalRoot);\n for (const element of elements) {\n const score = layoutSelectorScore(name, element, inner, body.distance);\n if (score !== void 0)\n result.push({ element, score });\n }\n result.sort((a, b) => a.score - b.score);\n return new Set(result.map((r) => r.element));\n }\n ariaSnapshot(node, options) {\n return this.ariaSnapshotWithRefs(node, options).text;\n }\n ariaSnapshotWithRefs(node, options) {\n if (node.nodeType !== Node.ELEMENT_NODE)\n throw this.createStacklessError("Can only capture aria snapshot of Element nodes.");\n options = { ...options, refPrefix: this._frameSeq && options.mode === "ai" ? "f" + this._frameSeq : "" };\n const ariaSnapshot = generateAriaTree(node, options);\n const rendered = renderAriaTree(ariaSnapshot, options);\n this._lastAriaSnapshotForQuery = ariaSnapshot;\n return { text: rendered.text, iframeRefs: ariaSnapshot.iframeRefs, iframeDepths: rendered.iframeDepths };\n }\n ariaSnapshotForRecorder() {\n const tree = generateAriaTree(this.document.body, { mode: "ai" });\n const { text: ariaSnapshot } = renderAriaTree(tree, { mode: "ai" });\n return { ariaSnapshot, refs: tree.refs };\n }\n ariaSnapshotForExpectFailure(element, options) {\n return renderAriaTree(generateAriaTree(element, options), options).text;\n }\n getAllElementsMatchingExpectAriaTemplate(document, template) {\n return getAllElementsMatchingExpectAriaTemplate(document.documentElement, template);\n }\n querySelectorAll(selector, root) {\n if (selector.capture !== void 0) {\n if (selector.parts.some((part) => part.name === "nth"))\n throw this.createStacklessError(`Can\'t query n-th element in a request with the capture.`);\n const withHas = { parts: selector.parts.slice(0, selector.capture + 1) };\n if (selector.capture < selector.parts.length - 1) {\n const parsed = { parts: selector.parts.slice(selector.capture + 1) };\n const has = { name: "internal:has", body: { parsed }, source: stringifySelector(parsed) };\n withHas.parts.push(has);\n }\n return this.querySelectorAll(withHas, root);\n }\n if (!root["querySelectorAll"])\n throw this.createStacklessError("Node is not queryable.");\n if (selector.capture !== void 0) {\n throw this.createStacklessError("Internal error: there should not be a capture in the selector.");\n }\n if (root.nodeType === 11 && selector.parts.length === 1 && selector.parts[0].name === "css" && selector.parts[0].source === ":scope")\n return [root];\n this._evaluator.begin();\n try {\n let roots = /* @__PURE__ */ new Set([root]);\n for (const part of selector.parts) {\n if (part.name === "nth") {\n roots = this._queryNth(roots, part);\n } else if (part.name === "internal:and") {\n const andElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(andElements.filter((e) => roots.has(e)));\n } else if (part.name === "internal:or") {\n const orElements = this.querySelectorAll(part.body.parsed, root);\n roots = new Set(sortInDOMOrder(/* @__PURE__ */ new Set([...roots, ...orElements])));\n } else if (kLayoutSelectorNames.includes(part.name)) {\n roots = this._queryLayoutSelector(roots, part, root);\n } else {\n const next = /* @__PURE__ */ new Set();\n for (const root2 of roots) {\n const all = this._queryEngineAll(part, root2);\n for (const one of all)\n next.add(one);\n }\n roots = next;\n }\n }\n return [...roots];\n } finally {\n this._evaluator.end();\n }\n }\n _queryEngineAll(part, root) {\n const result = this._engines.get(part.name).queryAll(root, part.body);\n for (const element of result) {\n if (!("nodeName" in element))\n throw this.createStacklessError(`Expected a Node but got ${Object.prototype.toString.call(element)}`);\n }\n return result;\n }\n _createAttributeEngine(attribute, shadow) {\n const toCSS = (selector) => {\n const css = `[${attribute}=${JSON.stringify(selector)}]`;\n return [{ simples: [{ selector: { css, functions: [] }, combinator: "" }] }];\n };\n return {\n queryAll: (root, selector) => {\n return this._evaluator.query({ scope: root, pierceShadow: shadow }, toCSS(selector));\n }\n };\n }\n _createCSSEngine() {\n return {\n queryAll: (root, body) => {\n return this._evaluator.query({ scope: root, pierceShadow: true }, body);\n }\n };\n }\n _createTextEngine(shadow, internal) {\n const queryAll = (root, selector) => {\n const { matcher, kind } = createTextMatcher(selector, internal);\n const result = [];\n let lastDidNotMatchSelf = null;\n const appendElement = (element) => {\n if (kind === "lax" && lastDidNotMatchSelf && lastDidNotMatchSelf.contains(element))\n return false;\n const matches = elementMatchesText(this._evaluator._cacheText, element, matcher);\n if (matches === "none")\n lastDidNotMatchSelf = element;\n if (matches === "self" || matches === "selfAndChildren" && kind === "strict" && !internal)\n result.push(element);\n };\n if (root.nodeType === Node.ELEMENT_NODE)\n appendElement(root);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: shadow }, "*");\n for (const element of elements)\n appendElement(element);\n return result;\n };\n return { queryAll };\n }\n _createInternalHasTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [element] : [];\n }\n };\n }\n _createInternalHasNotTextEngine() {\n return {\n queryAll: (root, selector) => {\n if (root.nodeType !== 1)\n return [];\n const element = root;\n const text = elementText(this._evaluator._cacheText, element);\n const { matcher } = createTextMatcher(selector, true);\n return matcher(text) ? [] : [element];\n }\n };\n }\n _createInternalLabelEngine() {\n return {\n queryAll: (root, selector) => {\n const { matcher } = createTextMatcher(selector, true);\n const allElements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, "*");\n return allElements.filter((element) => {\n return getElementLabels(this._evaluator._cacheText, element).some((label) => matcher(label));\n });\n }\n };\n }\n _createNamedAttributeEngine() {\n const queryAll = (root, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n if (parsed.name || parsed.attributes.length !== 1)\n throw new Error("Malformed attribute selector: " + selector);\n const { name } = parsed.attributes[0];\n const matcher = createAttributeMatcher(parsed.attributes[0]);\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, `[${name}]`);\n return elements.filter((e) => matcher(e.getAttribute(name)));\n };\n return { queryAll };\n }\n _createTestIdEngine() {\n const queryAll = (root, selector) => {\n const parsed = parseAttributeSelector(selector, true);\n if (parsed.name || parsed.attributes.length !== 1)\n throw new Error("Malformed test id selector: " + selector);\n const names = splitTestIdAttributeNames(parsed.attributes[0].name);\n const matcher = createAttributeMatcher(parsed.attributes[0]);\n const cssQuery = names.map((n) => `[${n}]`).join(",");\n const elements = this._evaluator._queryCSS({ scope: root, pierceShadow: true }, cssQuery);\n return elements.filter((e) => names.some((n) => {\n const actual = e.getAttribute(n);\n return actual !== null && matcher(actual);\n }));\n };\n return { queryAll };\n }\n _createDescribeEngine() {\n const queryAll = (root) => {\n if (root.nodeType !== 1)\n return [];\n return [root];\n };\n return { queryAll };\n }\n _createControlEngine() {\n return {\n queryAll(root, body) {\n if (body === "enter-frame")\n return [];\n if (body === "return-empty")\n return [];\n if (body === "component") {\n if (root.nodeType !== 1)\n return [];\n return [root.childElementCount === 1 ? root.firstElementChild : root];\n }\n throw new Error(`Internal error, unknown internal:control selector ${body}`);\n }\n };\n }\n _createHasEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [root] : [];\n };\n return { queryAll };\n }\n _createHasNotEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const has = !!this.querySelector(body.parsed, root, false);\n return has ? [] : [root];\n };\n return { queryAll };\n }\n _createVisibleEngine() {\n const queryAll = (root, body) => {\n if (root.nodeType !== 1)\n return [];\n const visible = body === "true";\n return isElementVisible(root) === visible ? [root] : [];\n };\n return { queryAll };\n }\n _createInternalChainEngine() {\n const queryAll = (root, body) => {\n return this.querySelectorAll(body.parsed, root);\n };\n return { queryAll };\n }\n extend(source, params) {\n const constrFunction = this.window.eval(`\n (() => {\n const module = {};\n ${source}\n return module.exports.default();\n })()`);\n return new constrFunction(this, params);\n }\n async viewportRatio(element) {\n return await new Promise((resolve) => {\n const observer = new IntersectionObserver((entries) => {\n resolve(entries[0].intersectionRatio);\n observer.disconnect();\n });\n observer.observe(element);\n this.utils.builtins.requestAnimationFrame(() => {\n });\n });\n }\n getElementBorderWidth(node) {\n if (node.nodeType !== Node.ELEMENT_NODE || !node.ownerDocument || !node.ownerDocument.defaultView)\n return { left: 0, top: 0 };\n const style = node.ownerDocument.defaultView.getComputedStyle(node);\n return { left: parseInt(style.borderLeftWidth || "", 10), top: parseInt(style.borderTopWidth || "", 10) };\n }\n describeIFrameStyle(iframe) {\n if (!iframe.ownerDocument || !iframe.ownerDocument.defaultView)\n return "error:notconnected";\n const defaultView = iframe.ownerDocument.defaultView;\n for (let e = iframe; e; e = parentElementOrShadowHost(e)) {\n if (defaultView.getComputedStyle(e).transform !== "none")\n return "transformed";\n }\n const iframeStyle = defaultView.getComputedStyle(iframe);\n return {\n left: parseInt(iframeStyle.borderLeftWidth || "", 10) + parseInt(iframeStyle.paddingLeft || "", 10),\n top: parseInt(iframeStyle.borderTopWidth || "", 10) + parseInt(iframeStyle.paddingTop || "", 10)\n };\n }\n retarget(node, behavior) {\n let element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;\n if (!element)\n return null;\n if (behavior === "none")\n return element;\n if (!element.matches("input, textarea, select") && !element.isContentEditable) {\n if (behavior === "button-link")\n element = element.closest("button, [role=button], a, [role=link]") || element;\n else\n element = element.closest("button, [role=button], [role=checkbox], [role=radio]") || element;\n }\n if (behavior === "follow-label") {\n if (!element.matches("a, input, textarea, button, select, [role=link], [role=button], [role=checkbox], [role=radio]") && !element.isContentEditable) {\n const enclosingLabel = element.closest("label");\n if (enclosingLabel && enclosingLabel.control)\n element = enclosingLabel.control;\n }\n }\n return element;\n }\n async checkElementStates(node, states) {\n if (states.includes("stable")) {\n const stableResult = await this._checkElementIsStable(node);\n if (stableResult === false)\n return { missingState: "stable" };\n if (stableResult === "error:notconnected")\n return "error:notconnected";\n }\n for (const state of states) {\n if (state !== "stable") {\n const result = this.elementState(node, state);\n if (result.received === "error:notconnected")\n return "error:notconnected";\n if (!result.matches)\n return { missingState: state };\n }\n }\n }\n async _checkElementIsStable(node) {\n const continuePolling = /* @__PURE__ */ Symbol("continuePolling");\n let lastRect;\n let stableRafCounter = 0;\n let lastTime = 0;\n const check = () => {\n const element = this.retarget(node, "no-follow-label");\n if (!element)\n return "error:notconnected";\n const time = this.utils.builtins.performance.now();\n if (this._stableRafCount > 1 && time - lastTime < 15)\n return continuePolling;\n lastTime = time;\n const clientRect = element.getBoundingClientRect();\n const rect = { x: clientRect.top, y: clientRect.left, width: clientRect.width, height: clientRect.height };\n if (lastRect) {\n const samePosition = rect.x === lastRect.x && rect.y === lastRect.y && rect.width === lastRect.width && rect.height === lastRect.height;\n if (!samePosition)\n return false;\n if (++stableRafCounter >= this._stableRafCount)\n return true;\n }\n lastRect = rect;\n return continuePolling;\n };\n let fulfill;\n let reject;\n const result = new Promise((f, r) => {\n fulfill = f;\n reject = r;\n });\n const raf = () => {\n try {\n const success = check();\n if (success !== continuePolling)\n fulfill(success);\n else\n this.utils.builtins.requestAnimationFrame(raf);\n } catch (e) {\n reject(e);\n }\n };\n this.utils.builtins.requestAnimationFrame(raf);\n return result;\n }\n _createAriaRefEngine() {\n const queryAll = (root, selector) => {\n var _a, _b;\n const result = (_b = (_a = this._lastAriaSnapshotForQuery) == null ? void 0 : _a.info) == null ? void 0 : _b.get(selector);\n return result && result.element.isConnected ? [result.element] : [];\n };\n return { queryAll };\n }\n elementState(node, state) {\n const element = this.retarget(node, ["visible", "hidden"].includes(state) ? "none" : "follow-label");\n if (!element || !element.isConnected) {\n if (state === "hidden")\n return { matches: true, received: "hidden" };\n return { matches: false, received: "error:notconnected" };\n }\n if (state === "visible" || state === "hidden") {\n const visible = isElementVisible(element);\n return {\n matches: state === "visible" ? visible : !visible,\n received: visible ? "visible" : "hidden"\n };\n }\n if (state === "disabled" || state === "enabled") {\n const disabled = getAriaDisabled(element);\n return {\n matches: state === "disabled" ? disabled : !disabled,\n received: disabled ? "disabled" : "enabled"\n };\n }\n if (state === "editable") {\n const disabled = getAriaDisabled(element);\n const readonly = getReadonly(element);\n if (readonly === "error")\n throw this.createStacklessError("Element is not an