jumpy-lion 0.1.6-beta.9 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -607
- package/browser/fonts/macos-bundle/41-macos-remaining.conf +157 -0
- package/browser/fonts/macos-bundle/README.md +24 -0
- package/browser/fonts/macos-bundle/build-metric-fonts.py +1010 -0
- package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AndaleMono-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AppleChancery-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Arial-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialBlack-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ArialNarrow-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Avenir-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNext-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Baskerville-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BigCaslon-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BradleyHand-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/BrushScriptMT-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkboard-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ChalkboardSE-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Chalkduster-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Charter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Cochin-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/ComicSansMS-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Copperplate-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Copperplate-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Courier-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/CourierNew-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Didot-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Futura-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Geneva-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Georgia-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/GillSans-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Helvetica-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HelveticaNeue-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Herculanum-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/HoeflerText-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Impact-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/LucidaGrande-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/LucidaGrande-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/MarkerFelt-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Menlo-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Monaco-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Noteworthy-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Noteworthy-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Optima-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Palatino-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Papyrus-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/PartyLET-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Phosphate-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/README.md +132 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Rockwell-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SavoyeLET-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Seravek-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SignPainter-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SignPainter-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Skia-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SnellRoundhand-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/SnellRoundhand-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Tahoma-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Tahoma-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Times-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TimesNewRoman-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Trattatello-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/TrebuchetMS-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Verdana-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Webdings-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/Zapfino-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/manifest.json +2928 -0
- package/browser/fonts/macos-bundle/generated/systemui-Bold.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-BoldItalic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-Italic.ttf +0 -0
- package/browser/fonts/macos-bundle/generated/systemui-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/install.sh +136 -0
- package/browser/fonts/macos-bundle/vendor/README.md +30 -0
- package/browser/fonts/macos-bundle/vendor/anton/Anton-Regular.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/anton/OFL.txt +93 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-Italic-VariableFont_wght.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-VariableFont_wght.ttf +0 -0
- package/browser/fonts/macos-bundle/vendor/gelasio/OFL.txt +93 -0
- package/browser/fonts/macos-bundle/verify-metric-fonts.py +171 -0
- package/dist/browser-controller.d.ts +47 -4
- package/dist/browser-controller.d.ts.map +1 -1
- package/dist/browser-controller.js +219 -278
- package/dist/browser-controller.js.map +1 -1
- package/dist/browser-plugin.d.ts +82 -110
- package/dist/browser-plugin.d.ts.map +1 -1
- package/dist/browser-plugin.js +405 -379
- package/dist/browser-plugin.js.map +1 -1
- package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
- package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/align-fingerprint-config.js +74 -0
- package/dist/browser-process/align-fingerprint-config.js.map +1 -0
- package/dist/browser-process/anti-detect-browser.d.ts +2 -2
- package/dist/browser-process/anti-detect-browser.js +7 -7
- package/dist/browser-process/anti-detect-config.d.ts +146 -2
- package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
- package/dist/browser-process/anti-detect-config.js +432 -127
- package/dist/browser-process/anti-detect-config.js.map +1 -1
- package/dist/browser-process/browser.d.ts +25 -92
- package/dist/browser-process/browser.d.ts.map +1 -1
- package/dist/browser-process/browser.js +467 -79
- package/dist/browser-process/browser.js.map +1 -1
- package/dist/browser-process/fingerprint-config.d.ts +146 -0
- package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
- package/dist/browser-process/fingerprint-config.js +351 -0
- package/dist/browser-process/fingerprint-config.js.map +1 -0
- package/dist/browser-process/get-chrome-executable.d.ts +6 -0
- package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
- package/dist/browser-process/get-chrome-executable.js +79 -4
- package/dist/browser-process/get-chrome-executable.js.map +1 -1
- package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
- package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
- package/dist/browser-process/gpu-family-profiles.js +480 -0
- package/dist/browser-process/gpu-family-profiles.js.map +1 -0
- package/dist/browser-process/launch-options.d.ts +301 -0
- package/dist/browser-process/launch-options.d.ts.map +1 -0
- package/dist/browser-process/launch-options.js +2 -0
- package/dist/browser-process/launch-options.js.map +1 -0
- package/dist/browser-process/port-allocator.d.ts +64 -0
- package/dist/browser-process/port-allocator.d.ts.map +1 -0
- package/dist/browser-process/port-allocator.js +198 -0
- package/dist/browser-process/port-allocator.js.map +1 -0
- package/dist/browser-process/process.d.ts +85 -0
- package/dist/browser-process/process.d.ts.map +1 -1
- package/dist/browser-process/process.js +235 -19
- package/dist/browser-process/process.js.map +1 -1
- package/dist/browser-process/signal-cleanup.d.ts +40 -0
- package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
- package/dist/browser-process/signal-cleanup.js +105 -0
- package/dist/browser-process/signal-cleanup.js.map +1 -0
- package/dist/browser-process/widevine-cdm.d.ts +144 -0
- package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
- package/dist/browser-process/widevine-cdm.js +298 -0
- package/dist/browser-process/widevine-cdm.js.map +1 -0
- package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
- package/dist/browser-profiles/chrome/populate-profile.js +21 -22
- package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
- package/dist/connection/cdp-reconnection.d.ts +50 -0
- package/dist/connection/cdp-reconnection.d.ts.map +1 -0
- package/dist/connection/cdp-reconnection.js +75 -0
- package/dist/connection/cdp-reconnection.js.map +1 -0
- package/dist/connection/page-session.d.ts +114 -0
- package/dist/connection/page-session.d.ts.map +1 -0
- package/dist/connection/page-session.js +237 -0
- package/dist/connection/page-session.js.map +1 -0
- package/dist/connection/session-client.d.ts +34 -0
- package/dist/connection/session-client.d.ts.map +1 -0
- package/dist/connection/session-client.js +129 -0
- package/dist/connection/session-client.js.map +1 -0
- package/dist/crawler.d.ts +9 -88
- package/dist/crawler.d.ts.map +1 -1
- package/dist/crawler.js +157 -8
- package/dist/crawler.js.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
- package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-injector.js +305 -611
- package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
- package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
- package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
- package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
- package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
- package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
- package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
- package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
- package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
- package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
- package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
- package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +28 -9
- package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
- package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
- package/dist/fingerprinting/hardware-realism.d.ts +74 -0
- package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
- package/dist/fingerprinting/hardware-realism.js +155 -0
- package/dist/fingerprinting/hardware-realism.js.map +1 -0
- package/dist/fingerprinting/injection-planner.d.ts +133 -0
- package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
- package/dist/fingerprinting/injection-planner.js +497 -0
- package/dist/fingerprinting/injection-planner.js.map +1 -0
- package/dist/fingerprinting/locale-resolver.d.ts +8 -1
- package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
- package/dist/fingerprinting/locale-resolver.js +26 -3
- package/dist/fingerprinting/locale-resolver.js.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
- package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
- package/dist/fingerprinting/non-apify-fingerprint-generator.js +35 -69
- package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
- package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
- package/dist/fingerprinting/os-consistency.d.ts +28 -0
- package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
- package/dist/fingerprinting/os-consistency.js +45 -0
- package/dist/fingerprinting/os-consistency.js.map +1 -0
- package/dist/fingerprinting/profile-quality.d.ts +25 -0
- package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
- package/dist/fingerprinting/profile-quality.js +310 -0
- package/dist/fingerprinting/profile-quality.js.map +1 -0
- package/dist/fingerprinting/profile-selector.d.ts +102 -0
- package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
- package/dist/fingerprinting/profile-selector.js +168 -0
- package/dist/fingerprinting/profile-selector.js.map +1 -0
- package/dist/fingerprinting/ua-alignment.d.ts +83 -0
- package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
- package/dist/fingerprinting/ua-alignment.js +197 -0
- package/dist/fingerprinting/ua-alignment.js.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
- package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
- package/dist/fingerprinting/ua-ch-brands.js +174 -0
- package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/input/dropdown-selector.d.ts +90 -0
- package/dist/input/dropdown-selector.d.ts.map +1 -0
- package/dist/input/dropdown-selector.js +394 -0
- package/dist/input/dropdown-selector.js.map +1 -0
- package/dist/input/element-target.d.ts +152 -0
- package/dist/input/element-target.d.ts.map +1 -0
- package/dist/input/element-target.js +461 -0
- package/dist/input/element-target.js.map +1 -0
- package/dist/input/input-emulator.d.ts +85 -0
- package/dist/input/input-emulator.d.ts.map +1 -0
- package/dist/input/input-emulator.js +325 -0
- package/dist/input/input-emulator.js.map +1 -0
- package/dist/input/input-transport.d.ts +60 -0
- package/dist/input/input-transport.d.ts.map +1 -0
- package/dist/input/input-transport.js +28 -0
- package/dist/input/input-transport.js.map +1 -0
- package/dist/input/recording-transport.d.ts +32 -0
- package/dist/input/recording-transport.d.ts.map +1 -0
- package/dist/input/recording-transport.js +43 -0
- package/dist/input/recording-transport.js.map +1 -0
- package/dist/keyboard-layout.d.ts +2 -2
- package/dist/keyboard-layout.js +2 -2
- package/dist/navigation/page-navigation.d.ts +67 -0
- package/dist/navigation/page-navigation.d.ts.map +1 -0
- package/dist/navigation/page-navigation.js +122 -0
- package/dist/navigation/page-navigation.js.map +1 -0
- package/dist/network/network-watch.d.ts +110 -0
- package/dist/network/network-watch.d.ts.map +1 -0
- package/dist/network/network-watch.js +223 -0
- package/dist/network/network-watch.js.map +1 -0
- package/dist/page.d.ts +123 -104
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +348 -1129
- package/dist/page.js.map +1 -1
- package/dist/session/inject-hook.d.ts +24 -0
- package/dist/session/inject-hook.d.ts.map +1 -0
- package/dist/session/inject-hook.js +80 -0
- package/dist/session/inject-hook.js.map +1 -0
- package/dist/session/save.d.ts +21 -0
- package/dist/session/save.d.ts.map +1 -0
- package/dist/session/save.js +163 -0
- package/dist/session/save.js.map +1 -0
- package/dist/session/tar-data-dir.d.ts +18 -0
- package/dist/session/tar-data-dir.d.ts.map +1 -0
- package/dist/session/tar-data-dir.js +105 -0
- package/dist/session/tar-data-dir.js.map +1 -0
- package/dist/session/types.d.ts +80 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +29 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session-profile.d.ts +102 -0
- package/dist/session-profile.d.ts.map +1 -0
- package/dist/session-profile.js +163 -0
- package/dist/session-profile.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +15 -6
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
- package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
- package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
- package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
- package/dist/launcher-wrap.d.ts +0 -10
- package/dist/launcher-wrap.d.ts.map +0 -1
- package/dist/launcher-wrap.js +0 -11
- package/dist/launcher-wrap.js.map +0 -1
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DropdownSelector - the deep module beside ElementTarget that owns the whole
|
|
3
|
+
* select/dropdown protocol: native `<select>` handling, custom-dropdown
|
|
4
|
+
* trigger detection, idempotent open (triggers TOGGLE, so blind clicks are
|
|
5
|
+
* racy), and option selection with bounded scrolling for virtualized lists
|
|
6
|
+
* and bounded polling for late-rendering options.
|
|
7
|
+
*
|
|
8
|
+
* Talks to the page only through the narrow {@link DropdownSelectorPort}
|
|
9
|
+
* (ElementTargetPort + waitForSelector + the loose visibility check), so the
|
|
10
|
+
* protocol is unit-testable with a scripted port. ElementTarget decides WHERE
|
|
11
|
+
* and WHEN for coordinate clicks; DropdownSelector orchestrates the
|
|
12
|
+
* select-specific sequence on top of the same port.
|
|
13
|
+
*/
|
|
14
|
+
import { humanizedClickTarget } from './element-target.js';
|
|
15
|
+
export const SCROLL_ANIMATION_DELAY_MS = 200; // ms to wait for scroll animations
|
|
16
|
+
export const OPTION_LOAD_DELAY_MS = 300; // ms to wait for new options to load in dropdowns
|
|
17
|
+
export const DROPDOWN_OPEN_DELAY_MS = 300; // ms to wait for dropdown to open
|
|
18
|
+
export const DEFAULT_SELECT_TIMEOUT_MS = 30000;
|
|
19
|
+
export class DropdownSelector {
|
|
20
|
+
constructor(port, elements) {
|
|
21
|
+
Object.defineProperty(this, "port", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: port
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(this, "elements", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: elements
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Selects one or more options from a select element or dropdown.
|
|
36
|
+
*
|
|
37
|
+
* Automatically handles both regular HTML select elements and custom dropdowns:
|
|
38
|
+
* - For <select> elements: Directly selects options within the select
|
|
39
|
+
* - For custom dropdowns: Automatically detects and clicks triggers to open dropdowns,
|
|
40
|
+
* then selects the specified options with intelligent scrolling for virtualized lists
|
|
41
|
+
*/
|
|
42
|
+
async selectOption(dropdownSelector, optionSelector, options) {
|
|
43
|
+
const timeout = options?.timeout ?? DEFAULT_SELECT_TIMEOUT_MS;
|
|
44
|
+
const force = options?.force ?? false;
|
|
45
|
+
const waitForOptions = options?.waitForOptions ?? true;
|
|
46
|
+
const maxScrollAttempts = options?.maxScrollAttempts ?? 10;
|
|
47
|
+
// Normalize target selectors to array
|
|
48
|
+
const targetSelectors = Array.isArray(optionSelector) ? optionSelector : [optionSelector];
|
|
49
|
+
// Wait for dropdown element to exist
|
|
50
|
+
await this.port.waitForSelector(dropdownSelector, { timeout });
|
|
51
|
+
// Check if this is a regular select element
|
|
52
|
+
const isSelectElement = await this.port.evaluate((sel) => {
|
|
53
|
+
const element = document.querySelector(sel);
|
|
54
|
+
return element?.tagName === 'SELECT';
|
|
55
|
+
}, dropdownSelector);
|
|
56
|
+
// For regular select elements, do visibility and disabled checks upfront
|
|
57
|
+
if (isSelectElement) {
|
|
58
|
+
// Check if element is visible (unless force is true)
|
|
59
|
+
if (!force) {
|
|
60
|
+
const isVisible = await this.elements.isVisible(dropdownSelector);
|
|
61
|
+
if (!isVisible) {
|
|
62
|
+
throw new Error(`Element is not visible: ${dropdownSelector}. Use force: true to bypass this check.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Check if element is disabled (unless force is true)
|
|
66
|
+
if (!force) {
|
|
67
|
+
const isDisabled = await this.port.evaluate((sel) => {
|
|
68
|
+
const element = document.querySelector(sel);
|
|
69
|
+
return element?.hasAttribute('disabled') || element?.getAttribute('disabled') === 'true';
|
|
70
|
+
}, dropdownSelector);
|
|
71
|
+
if (isDisabled) {
|
|
72
|
+
throw new Error(`Element is disabled: ${dropdownSelector}. Use force: true to bypass this check.`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Scroll element into view if needed
|
|
76
|
+
await this.elements.scrollIntoView(dropdownSelector);
|
|
77
|
+
// Wait for scroll animations to complete
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, SCROLL_ANIMATION_DELAY_MS));
|
|
79
|
+
await this._handleRegularSelect(dropdownSelector, targetSelectors);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Handle custom dropdown - the dropdownSelector is the container
|
|
83
|
+
await this._handleCustomDropdown(dropdownSelector, targetSelectors, {
|
|
84
|
+
timeout,
|
|
85
|
+
force,
|
|
86
|
+
waitForOptions,
|
|
87
|
+
maxScrollAttempts,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Turn an in-page {@link ClickHandoff} into an actual click, and report
|
|
93
|
+
* whether the element ended up clicked.
|
|
94
|
+
*
|
|
95
|
+
* Preferred path: a measured rect -> a trusted CDP Input click at a point
|
|
96
|
+
* inside it (randomized under mouse humanization, exact centre otherwise, so
|
|
97
|
+
* deterministic tests are unaffected). The in-page synthetic fallback is
|
|
98
|
+
* already-done work and simply reports success.
|
|
99
|
+
*/
|
|
100
|
+
async _completeHandoff(handoff) {
|
|
101
|
+
if (!handoff?.found)
|
|
102
|
+
return false;
|
|
103
|
+
if (handoff.clickedInPage)
|
|
104
|
+
return true;
|
|
105
|
+
const { rect } = handoff;
|
|
106
|
+
// The in-page step already clipped the box to the viewport, so any
|
|
107
|
+
// remaining area is a valid Input.dispatchMouseEvent target. A zero-area
|
|
108
|
+
// box means nothing visible was left to aim at.
|
|
109
|
+
if (!rect || rect.width <= 0 || rect.height <= 0) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const point = this.port.humanization().mouse
|
|
113
|
+
? humanizedClickTarget(rect)
|
|
114
|
+
: { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };
|
|
115
|
+
await this.port.clickAt(point.x, point.y);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Handles selection for regular HTML select elements
|
|
120
|
+
*/
|
|
121
|
+
async _handleRegularSelect(selectSelector, targetSelectors) {
|
|
122
|
+
const result = await this.port.evaluate((sel, targetSels) => {
|
|
123
|
+
const select = document.querySelector(sel);
|
|
124
|
+
if (!select) {
|
|
125
|
+
throw new Error(`Select element not found: ${sel}`);
|
|
126
|
+
}
|
|
127
|
+
// Check if multiple selection is allowed
|
|
128
|
+
if (!select.multiple && targetSels.length > 1) {
|
|
129
|
+
throw new Error(`Select element does not support multiple selection. Found ${targetSels.length} selectors but multiple is false.`);
|
|
130
|
+
}
|
|
131
|
+
// Clear previous selections
|
|
132
|
+
if (select.multiple) {
|
|
133
|
+
Array.from(select.options).forEach(option => {
|
|
134
|
+
option.selected = false;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
let foundCount = 0;
|
|
138
|
+
const foundSelectors = [];
|
|
139
|
+
// Select the options by CSS selector
|
|
140
|
+
for (const targetSelector of targetSels) {
|
|
141
|
+
let optionFound = false;
|
|
142
|
+
// Find option by CSS selector within the select element
|
|
143
|
+
const option = select.querySelector(targetSelector);
|
|
144
|
+
if (option) {
|
|
145
|
+
option.selected = true;
|
|
146
|
+
optionFound = true;
|
|
147
|
+
foundSelectors.push(targetSelector);
|
|
148
|
+
}
|
|
149
|
+
if (optionFound) {
|
|
150
|
+
foundCount++;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Fire `input` then `change`, matching the real browser event order
|
|
154
|
+
// for a user selection. React/Vue controlled <select>s listen for
|
|
155
|
+
// `input`; dispatching only `change` desyncs their state. Only when
|
|
156
|
+
// something was actually selected - firing them after a failed
|
|
157
|
+
// lookup told the page the value changed when it had not, and the
|
|
158
|
+
// driver then threw anyway.
|
|
159
|
+
if (foundCount > 0) {
|
|
160
|
+
select.dispatchEvent(new Event('input', { bubbles: true }));
|
|
161
|
+
select.dispatchEvent(new Event('change', { bubbles: true }));
|
|
162
|
+
}
|
|
163
|
+
return { foundCount, foundSelectors, totalOptions: select.options.length };
|
|
164
|
+
}, selectSelector, targetSelectors);
|
|
165
|
+
// A closed page resolves evaluate() to undefined.
|
|
166
|
+
if (!result) {
|
|
167
|
+
throw new Error(`Could not read <select> state for ${selectSelector}: the page is closed.`);
|
|
168
|
+
}
|
|
169
|
+
if (result.foundCount === 0) {
|
|
170
|
+
throw new Error(`No options found for selectors: ${targetSelectors.join(', ')}. Available options: ${result.totalOptions}`);
|
|
171
|
+
}
|
|
172
|
+
if (result.foundCount < targetSelectors.length) {
|
|
173
|
+
const missingSelectors = targetSelectors.filter(s => !result.foundSelectors.includes(s));
|
|
174
|
+
throw new Error(`Some selectors not found: ${missingSelectors.join(', ')}. Found: ${result.foundSelectors.join(', ')}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Handles selection for custom dropdown elements.
|
|
179
|
+
* Automatically detects and clicks triggers using multiple strategies:
|
|
180
|
+
* - Common trigger patterns ([aria-haspopup], .dropdown-trigger, etc.)
|
|
181
|
+
* - Previous sibling elements
|
|
182
|
+
* - ID pattern matching (menu → trigger)
|
|
183
|
+
*/
|
|
184
|
+
async _handleCustomDropdown(dropdownContainer, targetSelectors, options) {
|
|
185
|
+
const { timeout, force, waitForOptions, maxScrollAttempts, dropdownOpenDelay = DROPDOWN_OPEN_DELAY_MS } = options;
|
|
186
|
+
// Locate the dropdown's trigger and click it (through CDP Input) to
|
|
187
|
+
// toggle the menu open. Returns true when a trigger was found and
|
|
188
|
+
// clicked. Used by the idempotent open loop below (only invoked while
|
|
189
|
+
// the menu is still closed, so the toggle never accidentally re-closes
|
|
190
|
+
// an already-open menu).
|
|
191
|
+
const clickTrigger = async () => {
|
|
192
|
+
const handoff = await this.port.evaluate((containerSel) => {
|
|
193
|
+
const container = document.querySelector(containerSel);
|
|
194
|
+
if (!container)
|
|
195
|
+
return { found: false };
|
|
196
|
+
// Scroll the trigger into view, then measure it CLIPPED to the
|
|
197
|
+
// viewport so the driver can dispatch a trusted click at a point
|
|
198
|
+
// that is genuinely visible. Only an element with no visible
|
|
199
|
+
// area at all falls back to a synthetic click.
|
|
200
|
+
// NOTE: byte-identical to the option lookup's copy below. It
|
|
201
|
+
// cannot be hoisted - this function is shipped to the page via
|
|
202
|
+
// Function.toString() and so may not reference module scope.
|
|
203
|
+
const handOff = (el) => {
|
|
204
|
+
el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'auto' });
|
|
205
|
+
const r = el.getBoundingClientRect();
|
|
206
|
+
const left = Math.max(r.left, 0);
|
|
207
|
+
const top = Math.max(r.top, 0);
|
|
208
|
+
const right = Math.min(r.right, window.innerWidth);
|
|
209
|
+
const bottom = Math.min(r.bottom, window.innerHeight);
|
|
210
|
+
if (right - left > 0 && bottom - top > 0) {
|
|
211
|
+
return {
|
|
212
|
+
found: true,
|
|
213
|
+
rect: { x: left, y: top, width: right - left, height: bottom - top },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
el.click();
|
|
217
|
+
return { found: true, clickedInPage: true };
|
|
218
|
+
};
|
|
219
|
+
// Strategy 1: Look for sibling trigger elements with common patterns
|
|
220
|
+
const parent = container.parentElement;
|
|
221
|
+
if (parent) {
|
|
222
|
+
const triggers = parent.querySelectorAll('[role="button"], button, [data-toggle], [aria-haspopup], .dropdown-trigger, .select-trigger');
|
|
223
|
+
for (const trigger of triggers) {
|
|
224
|
+
if (trigger !== container) {
|
|
225
|
+
return handOff(trigger);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Strategy 2: Look for previous sibling that might be the trigger
|
|
229
|
+
const prevSibling = container.previousElementSibling;
|
|
230
|
+
if (prevSibling && prevSibling.tagName !== 'LABEL') {
|
|
231
|
+
return handOff(prevSibling);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Strategy 3: Look for element with similar ID (e.g., menu -> trigger)
|
|
235
|
+
const containerId = container.id;
|
|
236
|
+
if (containerId) {
|
|
237
|
+
const triggerPatterns = [
|
|
238
|
+
containerId.replace('menu', 'trigger').replace('dropdown', 'trigger'),
|
|
239
|
+
containerId.replace('-menu', '-trigger'),
|
|
240
|
+
containerId.replace('_menu', '_trigger'),
|
|
241
|
+
`${containerId}-trigger`,
|
|
242
|
+
`trigger-${containerId}`,
|
|
243
|
+
];
|
|
244
|
+
for (const triggerId of triggerPatterns) {
|
|
245
|
+
const trigger = document.getElementById(triggerId);
|
|
246
|
+
if (trigger && trigger !== container) {
|
|
247
|
+
return handOff(trigger);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { found: false };
|
|
252
|
+
}, dropdownContainer);
|
|
253
|
+
return await this._completeHandoff(handoff);
|
|
254
|
+
};
|
|
255
|
+
if (waitForOptions) {
|
|
256
|
+
await this.port.waitForSelector(dropdownContainer, { timeout });
|
|
257
|
+
}
|
|
258
|
+
// Idempotent open: dropdown triggers usually TOGGLE on click, so a
|
|
259
|
+
// single blind click is racy - if the menu was already open it closes
|
|
260
|
+
// it, and a timing hiccup can leave it closed while the option lookup
|
|
261
|
+
// below silently fails. Instead, only click while the menu is closed
|
|
262
|
+
// and re-check until it is actually visible (or the budget runs out).
|
|
263
|
+
if (!force) {
|
|
264
|
+
// Use the LOOSE display/visibility check, NOT the strict
|
|
265
|
+
// ElementTarget.isVisible: a menu opened with a CSS opacity/transform
|
|
266
|
+
// fade-in reads opacity:0 for the first frames, which the strict
|
|
267
|
+
// check counts as "not visible" - that would make the loop re-click
|
|
268
|
+
// the trigger and TOGGLE the just-opened menu shut. `display: block`
|
|
269
|
+
// is the real open signal.
|
|
270
|
+
const OPEN_ATTEMPTS = 5;
|
|
271
|
+
let opened = await this.port.isLooselyVisible(dropdownContainer);
|
|
272
|
+
for (let attempt = 0; attempt < OPEN_ATTEMPTS && !opened; attempt++) {
|
|
273
|
+
await clickTrigger();
|
|
274
|
+
await new Promise(resolve => setTimeout(resolve, dropdownOpenDelay));
|
|
275
|
+
opened = await this.port.isLooselyVisible(dropdownContainer);
|
|
276
|
+
}
|
|
277
|
+
if (!opened) {
|
|
278
|
+
throw new Error(`Dropdown container is not visible after trigger click: ${dropdownContainer}. Use force: true to bypass this check.`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Force path: open once, best-effort.
|
|
283
|
+
await clickTrigger();
|
|
284
|
+
await new Promise(resolve => setTimeout(resolve, dropdownOpenDelay));
|
|
285
|
+
}
|
|
286
|
+
// Select each target selector
|
|
287
|
+
for (const targetSelector of targetSelectors) {
|
|
288
|
+
await this._selectOptionFromDropdown(dropdownContainer, targetSelector, {
|
|
289
|
+
timeout,
|
|
290
|
+
maxScrollAttempts,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Selects a single option from a dropdown container.
|
|
296
|
+
* Handles virtualized lists with intelligent scrolling to find options that may not be initially visible.
|
|
297
|
+
*/
|
|
298
|
+
async _selectOptionFromDropdown(dropdownSelector, targetSelector, dropdownOptions) {
|
|
299
|
+
const { timeout, maxScrollAttempts } = dropdownOptions;
|
|
300
|
+
const startTime = Date.now();
|
|
301
|
+
let scrollAttempts = 0;
|
|
302
|
+
let optionFound = false;
|
|
303
|
+
// Custom dropdowns frequently render their options asynchronously after
|
|
304
|
+
// the trigger click, so the very first lookup can miss an option that
|
|
305
|
+
// appears a moment later. Poll a bounded number of times before
|
|
306
|
+
// concluding the option is genuinely absent - without this grace the
|
|
307
|
+
// selection is racy and fails intermittently on slower runs.
|
|
308
|
+
let notFoundPolls = 0;
|
|
309
|
+
const MAX_NOT_FOUND_POLLS = 10;
|
|
310
|
+
while (scrollAttempts < maxScrollAttempts && !optionFound && (Date.now() - startTime) < timeout) {
|
|
311
|
+
// Try to find and click the option; if it is absent but the list is
|
|
312
|
+
// still scrollable, scroll down within the SAME evaluate so a single
|
|
313
|
+
// round-trip covers both the lookup and the scroll for this
|
|
314
|
+
// iteration. The effective sequence is unchanged
|
|
315
|
+
// (find → scroll → wait → find → …); only the extra CDP round-trip
|
|
316
|
+
// that used to do the scroll separately is removed.
|
|
317
|
+
const result = await this.port.evaluate((dropdownSel, targetSel) => {
|
|
318
|
+
const dropdown = document.querySelector(dropdownSel);
|
|
319
|
+
if (!dropdown)
|
|
320
|
+
return { found: false, scrolled: false };
|
|
321
|
+
// Try to find the target element directly first
|
|
322
|
+
const targetOption = dropdown.querySelector(targetSel);
|
|
323
|
+
if (!targetOption) {
|
|
324
|
+
// Check if we need to scroll to find more options
|
|
325
|
+
const isScrollable = dropdown.scrollHeight > dropdown.clientHeight;
|
|
326
|
+
const isAtBottom = dropdown.scrollTop + dropdown.clientHeight >= dropdown.scrollHeight - 1;
|
|
327
|
+
if (isScrollable && !isAtBottom) {
|
|
328
|
+
// Scroll down to load more options (same amount as before).
|
|
329
|
+
dropdown.scrollTop += dropdown.clientHeight * 0.8;
|
|
330
|
+
return { found: false, scrolled: true };
|
|
331
|
+
}
|
|
332
|
+
return { found: false, scrolled: false };
|
|
333
|
+
}
|
|
334
|
+
// The option exists in the DOM - center it (instant scroll)
|
|
335
|
+
// and measure it CLIPPED to the viewport, so the driver can
|
|
336
|
+
// dispatch a TRUSTED click at a genuinely visible point. We
|
|
337
|
+
// deliberately do NOT gate on a rect-within-rect visibility
|
|
338
|
+
// test: that races layout / open-transitions, which made the
|
|
339
|
+
// loop spin until the timeout and intermittently throw
|
|
340
|
+
// "not found".
|
|
341
|
+
// NOTE: byte-identical to the trigger lookup's copy above.
|
|
342
|
+
// It cannot be hoisted - this function is shipped to the page
|
|
343
|
+
// via Function.toString() and so may not reference module scope.
|
|
344
|
+
const handOff = (el) => {
|
|
345
|
+
el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'auto' });
|
|
346
|
+
const r = el.getBoundingClientRect();
|
|
347
|
+
const left = Math.max(r.left, 0);
|
|
348
|
+
const top = Math.max(r.top, 0);
|
|
349
|
+
const right = Math.min(r.right, window.innerWidth);
|
|
350
|
+
const bottom = Math.min(r.bottom, window.innerHeight);
|
|
351
|
+
if (right - left > 0 && bottom - top > 0) {
|
|
352
|
+
return {
|
|
353
|
+
found: true,
|
|
354
|
+
rect: { x: left, y: top, width: right - left, height: bottom - top },
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
el.click();
|
|
358
|
+
return { found: true, clickedInPage: true };
|
|
359
|
+
};
|
|
360
|
+
return { ...handOff(targetOption), scrolled: false };
|
|
361
|
+
}, dropdownSelector, targetSelector);
|
|
362
|
+
// A closed page resolves evaluate() to undefined; treat it as "no
|
|
363
|
+
// result this round" rather than dereferencing it.
|
|
364
|
+
if (!result)
|
|
365
|
+
break;
|
|
366
|
+
if (result.found) {
|
|
367
|
+
optionFound = await this._completeHandoff(result);
|
|
368
|
+
if (optionFound)
|
|
369
|
+
break;
|
|
370
|
+
// Located but unclickable (no geometry and no in-page fallback):
|
|
371
|
+
// fall through to the not-found polling below.
|
|
372
|
+
}
|
|
373
|
+
if (result.scrolled) {
|
|
374
|
+
scrollAttempts++;
|
|
375
|
+
await new Promise(resolve => setTimeout(resolve, OPTION_LOAD_DELAY_MS)); // Wait for new options to load
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
// Option not present and dropdown not scrollable - it may still
|
|
379
|
+
// be rendering after the trigger click. Poll a bounded number of
|
|
380
|
+
// times before giving up so a late-rendering option is found,
|
|
381
|
+
// without burning the full timeout when it is genuinely absent.
|
|
382
|
+
notFoundPolls++;
|
|
383
|
+
if (notFoundPolls >= MAX_NOT_FOUND_POLLS) {
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
await new Promise(resolve => setTimeout(resolve, OPTION_LOAD_DELAY_MS));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (!optionFound) {
|
|
390
|
+
throw new Error(`Option "${targetSelector}" not found in dropdown "${dropdownSelector}"`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=dropdown-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-selector.js","sourceRoot":"","sources":["../../src/input/dropdown-selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ElementTarget - the deep module that turns a CSS selector into a stable,
|
|
3
|
+
* in-viewport coordinate target (or a typed failure: not found, invisible,
|
|
4
|
+
* unclickable, no box model, out of viewport).
|
|
5
|
+
*
|
|
6
|
+
* Sits beside InputEmulator: ElementTarget decides WHERE and WHEN to dispatch
|
|
7
|
+
* (geometry, visibility, scroll, position stabilization); InputEmulator
|
|
8
|
+
* decides HOW (paths, cadence, transport events). It talks to the page only
|
|
9
|
+
* through the narrow ElementTargetPort, so the whole acquire-protocol is
|
|
10
|
+
* unit-testable with a scripted port - same pattern as InputTransport's
|
|
11
|
+
* recording adapter.
|
|
12
|
+
*/
|
|
13
|
+
export declare const HUMAN_DELAY_MS = 200;
|
|
14
|
+
export declare const POSITION_STABILITY_TIMEOUT_MS = 2000;
|
|
15
|
+
export declare const POSITION_CHECK_INTERVAL_MS = 100;
|
|
16
|
+
export declare const POSITION_STABILITY_THRESHOLD = 3;
|
|
17
|
+
export declare const POSITION_TOLERANCE_PX = 1;
|
|
18
|
+
export declare const VIEWPORT_TOLERANCE_PX = 50;
|
|
19
|
+
/** An axis-aligned content box in viewport CSS pixels - the click surface. */
|
|
20
|
+
export interface ContentBox {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pick a click target inside an element's content box. Real users do NOT
|
|
28
|
+
* click the exact mathematical center - eye-tracking studies cluster
|
|
29
|
+
* clicks in the 30-70% range of each axis. Behavioral ML on click landing
|
|
30
|
+
* distributions (Cloudflare Turnstile 2025+, HUMAN Bot Defender) flags
|
|
31
|
+
* sessions whose clicks all hit pixel-perfect centers.
|
|
32
|
+
*
|
|
33
|
+
* Takes the axis-aligned {@link ContentBox} directly. The previous 8-element
|
|
34
|
+
* positional quad [x0,y0,...x3,y3] was synthesized from `getBoundingClientRect`
|
|
35
|
+
* (already axis-aligned) only to be reduced back via min/max over corners - a
|
|
36
|
+
* no-op for an axis-aligned box, so the box is passed straight through now.
|
|
37
|
+
*/
|
|
38
|
+
export declare function humanizedClickTarget(box: ContentBox): {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
};
|
|
42
|
+
export interface ElementInfo {
|
|
43
|
+
nodeId: number;
|
|
44
|
+
boundingBox: {
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
width: number;
|
|
48
|
+
height: number;
|
|
49
|
+
};
|
|
50
|
+
isVisible: boolean;
|
|
51
|
+
isClickable: boolean;
|
|
52
|
+
}
|
|
53
|
+
/** One-shot existence + visibility + clickability result from {@link probeElement}. */
|
|
54
|
+
export interface ElementProbe {
|
|
55
|
+
found: boolean;
|
|
56
|
+
isVisible: boolean;
|
|
57
|
+
isClickable: boolean;
|
|
58
|
+
boundingBox: {
|
|
59
|
+
x: number;
|
|
60
|
+
y: number;
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The narrow set of page capabilities ElementTarget consumes. The production
|
|
67
|
+
* adapter is built by CdpPage over its CDP client; tests supply a scripted
|
|
68
|
+
* port.
|
|
69
|
+
*/
|
|
70
|
+
export interface ElementTargetPort {
|
|
71
|
+
evaluate<T>(pageFunction: Function | string, ...args: any[]): Promise<T>;
|
|
72
|
+
/** Humanized scroll-to-element (curved wheel events); may throw on hidden nodes. */
|
|
73
|
+
humanScrollToElement(selector: string): Promise<void>;
|
|
74
|
+
/** Live humanization toggles - read at call time, not construction time. */
|
|
75
|
+
humanization(): {
|
|
76
|
+
mouse: boolean;
|
|
77
|
+
scroll: boolean;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export declare class ElementTarget {
|
|
81
|
+
private readonly port;
|
|
82
|
+
constructor(port: ElementTargetPort);
|
|
83
|
+
/**
|
|
84
|
+
* Gets detailed information about an element, or null when it is absent.
|
|
85
|
+
*
|
|
86
|
+
* Delegates to the shared {@link probeElement} like `isVisible`/`isClickable`
|
|
87
|
+
* do. It used to inline its own copy of the checks, which had already
|
|
88
|
+
* drifted: that copy ignored `opacity: 0` and ancestor-overflow clipping, so
|
|
89
|
+
* it reported `isVisible: true` for elements `acquire()` rejects as hidden.
|
|
90
|
+
* One implementation means the three can never disagree again.
|
|
91
|
+
*/
|
|
92
|
+
getElementInfo(selector: string): Promise<ElementInfo | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Enhanced visibility check (display/visibility/opacity + ancestor-overflow
|
|
95
|
+
* clipping). Delegates to the shared {@link probeElement} so it can never
|
|
96
|
+
* drift from the check `acquire` enforces. Returns false for a missing element.
|
|
97
|
+
*/
|
|
98
|
+
isVisible(selector: string): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Enhanced clickable check (disabled/pointer-events/dimensions/opacity;
|
|
101
|
+
* readonly is intentionally NOT a blocker). Delegates to the shared
|
|
102
|
+
* {@link probeElement}. Returns false for a missing element.
|
|
103
|
+
*/
|
|
104
|
+
isClickable(selector: string): Promise<boolean>;
|
|
105
|
+
/**
|
|
106
|
+
* Whether a form element is editable: present, not disabled, not readonly.
|
|
107
|
+
* Exposed separately from {@link isClickable} because readonly elements are
|
|
108
|
+
* clickable/focusable but not editable.
|
|
109
|
+
*/
|
|
110
|
+
isEditable(selector: string): Promise<boolean>;
|
|
111
|
+
/**
|
|
112
|
+
* Enhanced scroll into view with better positioning
|
|
113
|
+
*/
|
|
114
|
+
scrollIntoView(selector: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Waits for an element's position to stabilize before interacting with it.
|
|
117
|
+
* Useful for letting scroll animations or dynamic layout changes settle.
|
|
118
|
+
* Times out silently - some elements never stabilize; callers proceed at their own risk.
|
|
119
|
+
*
|
|
120
|
+
* The observation runs entirely in-page in a SINGLE evaluate round-trip:
|
|
121
|
+
* a `requestAnimationFrame` loop samples the element's position, but only
|
|
122
|
+
* once every `checkInterval` ms of wall-clock, so the settle window matches
|
|
123
|
+
* the historical driver-side poll (N stable samples spaced `checkInterval`
|
|
124
|
+
* apart). The behaviour observable to the site is identical - it still waits
|
|
125
|
+
* the same duration for layout to settle before the click; only the internal
|
|
126
|
+
* transport changes (one round-trip instead of one evaluate per tick). A
|
|
127
|
+
* setTimeout hard-cap guarantees termination even if rAF is paused (a
|
|
128
|
+
* backgrounded tab), matching the old loop which always ended at `timeout`.
|
|
129
|
+
*/
|
|
130
|
+
waitForPositionToStabilize(selector: string, timeout?: number, checkInterval?: number, stabilityThreshold?: number, tolerance?: number): Promise<void>;
|
|
131
|
+
/**
|
|
132
|
+
* Check if element is within the viewport (with some tolerance)
|
|
133
|
+
*/
|
|
134
|
+
isInViewport(selector: string): Promise<boolean>;
|
|
135
|
+
/**
|
|
136
|
+
* The full pre-click targeting protocol: existence + visibility +
|
|
137
|
+
* clickability checks, scroll into view, position stabilization, box-model
|
|
138
|
+
* geometry, humanized (or exact-center) point selection, and a final
|
|
139
|
+
* in-viewport check. Returns the coordinates to click; throws a typed
|
|
140
|
+
* failure otherwise.
|
|
141
|
+
*
|
|
142
|
+
* With `force: true` every check is bypassed and a hidden element falls
|
|
143
|
+
* back to its bounding-box center.
|
|
144
|
+
*/
|
|
145
|
+
acquire(selector: string, options?: {
|
|
146
|
+
force?: boolean;
|
|
147
|
+
}): Promise<{
|
|
148
|
+
x: number;
|
|
149
|
+
y: number;
|
|
150
|
+
}>;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=element-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element-target.d.ts","sourceRoot":"","sources":["../../src/input/element-target.ts"],"names":[],"mappings":"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"}
|