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.
Files changed (450) hide show
  1. package/README.md +1 -607
  2. package/browser/fonts/macos-bundle/41-macos-remaining.conf +157 -0
  3. package/browser/fonts/macos-bundle/README.md +24 -0
  4. package/browser/fonts/macos-bundle/build-metric-fonts.py +1010 -0
  5. package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Bold.ttf +0 -0
  6. package/browser/fonts/macos-bundle/generated/AmericanTypewriter-Regular.ttf +0 -0
  7. package/browser/fonts/macos-bundle/generated/AndaleMono-Bold.ttf +0 -0
  8. package/browser/fonts/macos-bundle/generated/AndaleMono-BoldItalic.ttf +0 -0
  9. package/browser/fonts/macos-bundle/generated/AndaleMono-Italic.ttf +0 -0
  10. package/browser/fonts/macos-bundle/generated/AndaleMono-Regular.ttf +0 -0
  11. package/browser/fonts/macos-bundle/generated/AppleChancery-Bold.ttf +0 -0
  12. package/browser/fonts/macos-bundle/generated/AppleChancery-BoldItalic.ttf +0 -0
  13. package/browser/fonts/macos-bundle/generated/AppleChancery-Italic.ttf +0 -0
  14. package/browser/fonts/macos-bundle/generated/AppleChancery-Regular.ttf +0 -0
  15. package/browser/fonts/macos-bundle/generated/Arial-Bold.ttf +0 -0
  16. package/browser/fonts/macos-bundle/generated/Arial-BoldItalic.ttf +0 -0
  17. package/browser/fonts/macos-bundle/generated/Arial-Italic.ttf +0 -0
  18. package/browser/fonts/macos-bundle/generated/Arial-Regular.ttf +0 -0
  19. package/browser/fonts/macos-bundle/generated/ArialBlack-Bold.ttf +0 -0
  20. package/browser/fonts/macos-bundle/generated/ArialBlack-BoldItalic.ttf +0 -0
  21. package/browser/fonts/macos-bundle/generated/ArialBlack-Italic.ttf +0 -0
  22. package/browser/fonts/macos-bundle/generated/ArialBlack-Regular.ttf +0 -0
  23. package/browser/fonts/macos-bundle/generated/ArialNarrow-Bold.ttf +0 -0
  24. package/browser/fonts/macos-bundle/generated/ArialNarrow-BoldItalic.ttf +0 -0
  25. package/browser/fonts/macos-bundle/generated/ArialNarrow-Italic.ttf +0 -0
  26. package/browser/fonts/macos-bundle/generated/ArialNarrow-Regular.ttf +0 -0
  27. package/browser/fonts/macos-bundle/generated/Avenir-Bold.ttf +0 -0
  28. package/browser/fonts/macos-bundle/generated/Avenir-BoldItalic.ttf +0 -0
  29. package/browser/fonts/macos-bundle/generated/Avenir-Italic.ttf +0 -0
  30. package/browser/fonts/macos-bundle/generated/Avenir-Regular.ttf +0 -0
  31. package/browser/fonts/macos-bundle/generated/AvenirNext-Bold.ttf +0 -0
  32. package/browser/fonts/macos-bundle/generated/AvenirNext-BoldItalic.ttf +0 -0
  33. package/browser/fonts/macos-bundle/generated/AvenirNext-Italic.ttf +0 -0
  34. package/browser/fonts/macos-bundle/generated/AvenirNext-Regular.ttf +0 -0
  35. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Bold.ttf +0 -0
  36. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-BoldItalic.ttf +0 -0
  37. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Italic.ttf +0 -0
  38. package/browser/fonts/macos-bundle/generated/AvenirNextCondensed-Regular.ttf +0 -0
  39. package/browser/fonts/macos-bundle/generated/Baskerville-Bold.ttf +0 -0
  40. package/browser/fonts/macos-bundle/generated/Baskerville-BoldItalic.ttf +0 -0
  41. package/browser/fonts/macos-bundle/generated/Baskerville-Italic.ttf +0 -0
  42. package/browser/fonts/macos-bundle/generated/Baskerville-Regular.ttf +0 -0
  43. package/browser/fonts/macos-bundle/generated/BigCaslon-Bold.ttf +0 -0
  44. package/browser/fonts/macos-bundle/generated/BigCaslon-BoldItalic.ttf +0 -0
  45. package/browser/fonts/macos-bundle/generated/BigCaslon-Italic.ttf +0 -0
  46. package/browser/fonts/macos-bundle/generated/BigCaslon-Regular.ttf +0 -0
  47. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Bold.ttf +0 -0
  48. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-BoldItalic.ttf +0 -0
  49. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Italic.ttf +0 -0
  50. package/browser/fonts/macos-bundle/generated/BlinkMacSystemFont-Regular.ttf +0 -0
  51. package/browser/fonts/macos-bundle/generated/Bodoni72-Bold.ttf +0 -0
  52. package/browser/fonts/macos-bundle/generated/Bodoni72-BoldItalic.ttf +0 -0
  53. package/browser/fonts/macos-bundle/generated/Bodoni72-Italic.ttf +0 -0
  54. package/browser/fonts/macos-bundle/generated/Bodoni72-Regular.ttf +0 -0
  55. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Bold.ttf +0 -0
  56. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-BoldItalic.ttf +0 -0
  57. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Italic.ttf +0 -0
  58. package/browser/fonts/macos-bundle/generated/Bodoni72Oldstyle-Regular.ttf +0 -0
  59. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Bold.ttf +0 -0
  60. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-BoldItalic.ttf +0 -0
  61. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Italic.ttf +0 -0
  62. package/browser/fonts/macos-bundle/generated/Bodoni72Smallcaps-Regular.ttf +0 -0
  63. package/browser/fonts/macos-bundle/generated/BradleyHand-Regular.ttf +0 -0
  64. package/browser/fonts/macos-bundle/generated/BrushScriptMT-Regular.ttf +0 -0
  65. package/browser/fonts/macos-bundle/generated/Chalkboard-Bold.ttf +0 -0
  66. package/browser/fonts/macos-bundle/generated/Chalkboard-BoldItalic.ttf +0 -0
  67. package/browser/fonts/macos-bundle/generated/Chalkboard-Italic.ttf +0 -0
  68. package/browser/fonts/macos-bundle/generated/Chalkboard-Regular.ttf +0 -0
  69. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Bold.ttf +0 -0
  70. package/browser/fonts/macos-bundle/generated/ChalkboardSE-BoldItalic.ttf +0 -0
  71. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Italic.ttf +0 -0
  72. package/browser/fonts/macos-bundle/generated/ChalkboardSE-Regular.ttf +0 -0
  73. package/browser/fonts/macos-bundle/generated/Chalkduster-Bold.ttf +0 -0
  74. package/browser/fonts/macos-bundle/generated/Chalkduster-BoldItalic.ttf +0 -0
  75. package/browser/fonts/macos-bundle/generated/Chalkduster-Italic.ttf +0 -0
  76. package/browser/fonts/macos-bundle/generated/Chalkduster-Regular.ttf +0 -0
  77. package/browser/fonts/macos-bundle/generated/Charter-Bold.ttf +0 -0
  78. package/browser/fonts/macos-bundle/generated/Charter-BoldItalic.ttf +0 -0
  79. package/browser/fonts/macos-bundle/generated/Charter-Italic.ttf +0 -0
  80. package/browser/fonts/macos-bundle/generated/Charter-Regular.ttf +0 -0
  81. package/browser/fonts/macos-bundle/generated/Cochin-Bold.ttf +0 -0
  82. package/browser/fonts/macos-bundle/generated/Cochin-BoldItalic.ttf +0 -0
  83. package/browser/fonts/macos-bundle/generated/Cochin-Italic.ttf +0 -0
  84. package/browser/fonts/macos-bundle/generated/Cochin-Regular.ttf +0 -0
  85. package/browser/fonts/macos-bundle/generated/ComicSansMS-Bold.ttf +0 -0
  86. package/browser/fonts/macos-bundle/generated/ComicSansMS-BoldItalic.ttf +0 -0
  87. package/browser/fonts/macos-bundle/generated/ComicSansMS-Italic.ttf +0 -0
  88. package/browser/fonts/macos-bundle/generated/ComicSansMS-Regular.ttf +0 -0
  89. package/browser/fonts/macos-bundle/generated/Copperplate-Bold.ttf +0 -0
  90. package/browser/fonts/macos-bundle/generated/Copperplate-Regular.ttf +0 -0
  91. package/browser/fonts/macos-bundle/generated/Courier-Bold.ttf +0 -0
  92. package/browser/fonts/macos-bundle/generated/Courier-BoldItalic.ttf +0 -0
  93. package/browser/fonts/macos-bundle/generated/Courier-Italic.ttf +0 -0
  94. package/browser/fonts/macos-bundle/generated/Courier-Regular.ttf +0 -0
  95. package/browser/fonts/macos-bundle/generated/CourierNew-Regular.ttf +0 -0
  96. package/browser/fonts/macos-bundle/generated/Didot-Bold.ttf +0 -0
  97. package/browser/fonts/macos-bundle/generated/Didot-BoldItalic.ttf +0 -0
  98. package/browser/fonts/macos-bundle/generated/Didot-Italic.ttf +0 -0
  99. package/browser/fonts/macos-bundle/generated/Didot-Regular.ttf +0 -0
  100. package/browser/fonts/macos-bundle/generated/Futura-Bold.ttf +0 -0
  101. package/browser/fonts/macos-bundle/generated/Futura-BoldItalic.ttf +0 -0
  102. package/browser/fonts/macos-bundle/generated/Futura-Italic.ttf +0 -0
  103. package/browser/fonts/macos-bundle/generated/Futura-Regular.ttf +0 -0
  104. package/browser/fonts/macos-bundle/generated/Geneva-Regular.ttf +0 -0
  105. package/browser/fonts/macos-bundle/generated/Georgia-Bold.ttf +0 -0
  106. package/browser/fonts/macos-bundle/generated/Georgia-BoldItalic.ttf +0 -0
  107. package/browser/fonts/macos-bundle/generated/Georgia-Italic.ttf +0 -0
  108. package/browser/fonts/macos-bundle/generated/Georgia-Regular.ttf +0 -0
  109. package/browser/fonts/macos-bundle/generated/GillSans-Bold.ttf +0 -0
  110. package/browser/fonts/macos-bundle/generated/GillSans-BoldItalic.ttf +0 -0
  111. package/browser/fonts/macos-bundle/generated/GillSans-Italic.ttf +0 -0
  112. package/browser/fonts/macos-bundle/generated/GillSans-Regular.ttf +0 -0
  113. package/browser/fonts/macos-bundle/generated/Helvetica-Bold.ttf +0 -0
  114. package/browser/fonts/macos-bundle/generated/Helvetica-BoldItalic.ttf +0 -0
  115. package/browser/fonts/macos-bundle/generated/Helvetica-Italic.ttf +0 -0
  116. package/browser/fonts/macos-bundle/generated/Helvetica-Regular.ttf +0 -0
  117. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Bold.ttf +0 -0
  118. package/browser/fonts/macos-bundle/generated/HelveticaNeue-BoldItalic.ttf +0 -0
  119. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Italic.ttf +0 -0
  120. package/browser/fonts/macos-bundle/generated/HelveticaNeue-Regular.ttf +0 -0
  121. package/browser/fonts/macos-bundle/generated/Herculanum-Bold.ttf +0 -0
  122. package/browser/fonts/macos-bundle/generated/Herculanum-BoldItalic.ttf +0 -0
  123. package/browser/fonts/macos-bundle/generated/Herculanum-Italic.ttf +0 -0
  124. package/browser/fonts/macos-bundle/generated/Herculanum-Regular.ttf +0 -0
  125. package/browser/fonts/macos-bundle/generated/HoeflerText-Bold.ttf +0 -0
  126. package/browser/fonts/macos-bundle/generated/HoeflerText-BoldItalic.ttf +0 -0
  127. package/browser/fonts/macos-bundle/generated/HoeflerText-Italic.ttf +0 -0
  128. package/browser/fonts/macos-bundle/generated/HoeflerText-Regular.ttf +0 -0
  129. package/browser/fonts/macos-bundle/generated/Impact-Bold.ttf +0 -0
  130. package/browser/fonts/macos-bundle/generated/Impact-BoldItalic.ttf +0 -0
  131. package/browser/fonts/macos-bundle/generated/Impact-Italic.ttf +0 -0
  132. package/browser/fonts/macos-bundle/generated/Impact-Regular.ttf +0 -0
  133. package/browser/fonts/macos-bundle/generated/LucidaGrande-Bold.ttf +0 -0
  134. package/browser/fonts/macos-bundle/generated/LucidaGrande-Regular.ttf +0 -0
  135. package/browser/fonts/macos-bundle/generated/MarkerFelt-Bold.ttf +0 -0
  136. package/browser/fonts/macos-bundle/generated/MarkerFelt-BoldItalic.ttf +0 -0
  137. package/browser/fonts/macos-bundle/generated/MarkerFelt-Italic.ttf +0 -0
  138. package/browser/fonts/macos-bundle/generated/MarkerFelt-Regular.ttf +0 -0
  139. package/browser/fonts/macos-bundle/generated/Menlo-Regular.ttf +0 -0
  140. package/browser/fonts/macos-bundle/generated/Monaco-Bold.ttf +0 -0
  141. package/browser/fonts/macos-bundle/generated/Monaco-BoldItalic.ttf +0 -0
  142. package/browser/fonts/macos-bundle/generated/Monaco-Italic.ttf +0 -0
  143. package/browser/fonts/macos-bundle/generated/Monaco-Regular.ttf +0 -0
  144. package/browser/fonts/macos-bundle/generated/Noteworthy-Bold.ttf +0 -0
  145. package/browser/fonts/macos-bundle/generated/Noteworthy-Regular.ttf +0 -0
  146. package/browser/fonts/macos-bundle/generated/Optima-Bold.ttf +0 -0
  147. package/browser/fonts/macos-bundle/generated/Optima-BoldItalic.ttf +0 -0
  148. package/browser/fonts/macos-bundle/generated/Optima-Italic.ttf +0 -0
  149. package/browser/fonts/macos-bundle/generated/Optima-Regular.ttf +0 -0
  150. package/browser/fonts/macos-bundle/generated/Palatino-Bold.ttf +0 -0
  151. package/browser/fonts/macos-bundle/generated/Palatino-BoldItalic.ttf +0 -0
  152. package/browser/fonts/macos-bundle/generated/Palatino-Italic.ttf +0 -0
  153. package/browser/fonts/macos-bundle/generated/Palatino-Regular.ttf +0 -0
  154. package/browser/fonts/macos-bundle/generated/Papyrus-Bold.ttf +0 -0
  155. package/browser/fonts/macos-bundle/generated/Papyrus-BoldItalic.ttf +0 -0
  156. package/browser/fonts/macos-bundle/generated/Papyrus-Italic.ttf +0 -0
  157. package/browser/fonts/macos-bundle/generated/Papyrus-Regular.ttf +0 -0
  158. package/browser/fonts/macos-bundle/generated/PartyLET-Bold.ttf +0 -0
  159. package/browser/fonts/macos-bundle/generated/PartyLET-BoldItalic.ttf +0 -0
  160. package/browser/fonts/macos-bundle/generated/PartyLET-Italic.ttf +0 -0
  161. package/browser/fonts/macos-bundle/generated/PartyLET-Regular.ttf +0 -0
  162. package/browser/fonts/macos-bundle/generated/Phosphate-Regular.ttf +0 -0
  163. package/browser/fonts/macos-bundle/generated/README.md +132 -0
  164. package/browser/fonts/macos-bundle/generated/Rockwell-Bold.ttf +0 -0
  165. package/browser/fonts/macos-bundle/generated/Rockwell-BoldItalic.ttf +0 -0
  166. package/browser/fonts/macos-bundle/generated/Rockwell-Italic.ttf +0 -0
  167. package/browser/fonts/macos-bundle/generated/Rockwell-Regular.ttf +0 -0
  168. package/browser/fonts/macos-bundle/generated/SavoyeLET-Bold.ttf +0 -0
  169. package/browser/fonts/macos-bundle/generated/SavoyeLET-BoldItalic.ttf +0 -0
  170. package/browser/fonts/macos-bundle/generated/SavoyeLET-Italic.ttf +0 -0
  171. package/browser/fonts/macos-bundle/generated/SavoyeLET-Regular.ttf +0 -0
  172. package/browser/fonts/macos-bundle/generated/Seravek-Bold.ttf +0 -0
  173. package/browser/fonts/macos-bundle/generated/Seravek-BoldItalic.ttf +0 -0
  174. package/browser/fonts/macos-bundle/generated/Seravek-Italic.ttf +0 -0
  175. package/browser/fonts/macos-bundle/generated/Seravek-Regular.ttf +0 -0
  176. package/browser/fonts/macos-bundle/generated/SignPainter-Bold.ttf +0 -0
  177. package/browser/fonts/macos-bundle/generated/SignPainter-Regular.ttf +0 -0
  178. package/browser/fonts/macos-bundle/generated/Skia-Bold.ttf +0 -0
  179. package/browser/fonts/macos-bundle/generated/Skia-BoldItalic.ttf +0 -0
  180. package/browser/fonts/macos-bundle/generated/Skia-Italic.ttf +0 -0
  181. package/browser/fonts/macos-bundle/generated/Skia-Regular.ttf +0 -0
  182. package/browser/fonts/macos-bundle/generated/SnellRoundhand-Bold.ttf +0 -0
  183. package/browser/fonts/macos-bundle/generated/SnellRoundhand-Regular.ttf +0 -0
  184. package/browser/fonts/macos-bundle/generated/Tahoma-Bold.ttf +0 -0
  185. package/browser/fonts/macos-bundle/generated/Tahoma-Regular.ttf +0 -0
  186. package/browser/fonts/macos-bundle/generated/Times-Bold.ttf +0 -0
  187. package/browser/fonts/macos-bundle/generated/Times-BoldItalic.ttf +0 -0
  188. package/browser/fonts/macos-bundle/generated/Times-Italic.ttf +0 -0
  189. package/browser/fonts/macos-bundle/generated/Times-Regular.ttf +0 -0
  190. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Bold.ttf +0 -0
  191. package/browser/fonts/macos-bundle/generated/TimesNewRoman-BoldItalic.ttf +0 -0
  192. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Italic.ttf +0 -0
  193. package/browser/fonts/macos-bundle/generated/TimesNewRoman-Regular.ttf +0 -0
  194. package/browser/fonts/macos-bundle/generated/Trattatello-Regular.ttf +0 -0
  195. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Bold.ttf +0 -0
  196. package/browser/fonts/macos-bundle/generated/TrebuchetMS-BoldItalic.ttf +0 -0
  197. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Italic.ttf +0 -0
  198. package/browser/fonts/macos-bundle/generated/TrebuchetMS-Regular.ttf +0 -0
  199. package/browser/fonts/macos-bundle/generated/Verdana-Bold.ttf +0 -0
  200. package/browser/fonts/macos-bundle/generated/Verdana-BoldItalic.ttf +0 -0
  201. package/browser/fonts/macos-bundle/generated/Verdana-Italic.ttf +0 -0
  202. package/browser/fonts/macos-bundle/generated/Verdana-Regular.ttf +0 -0
  203. package/browser/fonts/macos-bundle/generated/Webdings-Bold.ttf +0 -0
  204. package/browser/fonts/macos-bundle/generated/Webdings-BoldItalic.ttf +0 -0
  205. package/browser/fonts/macos-bundle/generated/Webdings-Italic.ttf +0 -0
  206. package/browser/fonts/macos-bundle/generated/Webdings-Regular.ttf +0 -0
  207. package/browser/fonts/macos-bundle/generated/Zapfino-Bold.ttf +0 -0
  208. package/browser/fonts/macos-bundle/generated/Zapfino-BoldItalic.ttf +0 -0
  209. package/browser/fonts/macos-bundle/generated/Zapfino-Italic.ttf +0 -0
  210. package/browser/fonts/macos-bundle/generated/Zapfino-Regular.ttf +0 -0
  211. package/browser/fonts/macos-bundle/generated/manifest.json +2928 -0
  212. package/browser/fonts/macos-bundle/generated/systemui-Bold.ttf +0 -0
  213. package/browser/fonts/macos-bundle/generated/systemui-BoldItalic.ttf +0 -0
  214. package/browser/fonts/macos-bundle/generated/systemui-Italic.ttf +0 -0
  215. package/browser/fonts/macos-bundle/generated/systemui-Regular.ttf +0 -0
  216. package/browser/fonts/macos-bundle/install.sh +136 -0
  217. package/browser/fonts/macos-bundle/vendor/README.md +30 -0
  218. package/browser/fonts/macos-bundle/vendor/anton/Anton-Regular.ttf +0 -0
  219. package/browser/fonts/macos-bundle/vendor/anton/OFL.txt +93 -0
  220. package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-Italic-VariableFont_wght.ttf +0 -0
  221. package/browser/fonts/macos-bundle/vendor/gelasio/Gelasio-VariableFont_wght.ttf +0 -0
  222. package/browser/fonts/macos-bundle/vendor/gelasio/OFL.txt +93 -0
  223. package/browser/fonts/macos-bundle/verify-metric-fonts.py +171 -0
  224. package/dist/browser-controller.d.ts +47 -4
  225. package/dist/browser-controller.d.ts.map +1 -1
  226. package/dist/browser-controller.js +219 -278
  227. package/dist/browser-controller.js.map +1 -1
  228. package/dist/browser-plugin.d.ts +82 -110
  229. package/dist/browser-plugin.d.ts.map +1 -1
  230. package/dist/browser-plugin.js +405 -379
  231. package/dist/browser-plugin.js.map +1 -1
  232. package/dist/browser-process/align-fingerprint-config.d.ts +36 -0
  233. package/dist/browser-process/align-fingerprint-config.d.ts.map +1 -0
  234. package/dist/browser-process/align-fingerprint-config.js +74 -0
  235. package/dist/browser-process/align-fingerprint-config.js.map +1 -0
  236. package/dist/browser-process/anti-detect-browser.d.ts +2 -2
  237. package/dist/browser-process/anti-detect-browser.js +7 -7
  238. package/dist/browser-process/anti-detect-config.d.ts +146 -2
  239. package/dist/browser-process/anti-detect-config.d.ts.map +1 -1
  240. package/dist/browser-process/anti-detect-config.js +432 -127
  241. package/dist/browser-process/anti-detect-config.js.map +1 -1
  242. package/dist/browser-process/browser.d.ts +25 -92
  243. package/dist/browser-process/browser.d.ts.map +1 -1
  244. package/dist/browser-process/browser.js +467 -79
  245. package/dist/browser-process/browser.js.map +1 -1
  246. package/dist/browser-process/fingerprint-config.d.ts +146 -0
  247. package/dist/browser-process/fingerprint-config.d.ts.map +1 -0
  248. package/dist/browser-process/fingerprint-config.js +351 -0
  249. package/dist/browser-process/fingerprint-config.js.map +1 -0
  250. package/dist/browser-process/get-chrome-executable.d.ts +6 -0
  251. package/dist/browser-process/get-chrome-executable.d.ts.map +1 -1
  252. package/dist/browser-process/get-chrome-executable.js +79 -4
  253. package/dist/browser-process/get-chrome-executable.js.map +1 -1
  254. package/dist/browser-process/gpu-family-profiles.d.ts +58 -0
  255. package/dist/browser-process/gpu-family-profiles.d.ts.map +1 -0
  256. package/dist/browser-process/gpu-family-profiles.js +480 -0
  257. package/dist/browser-process/gpu-family-profiles.js.map +1 -0
  258. package/dist/browser-process/launch-options.d.ts +301 -0
  259. package/dist/browser-process/launch-options.d.ts.map +1 -0
  260. package/dist/browser-process/launch-options.js +2 -0
  261. package/dist/browser-process/launch-options.js.map +1 -0
  262. package/dist/browser-process/port-allocator.d.ts +64 -0
  263. package/dist/browser-process/port-allocator.d.ts.map +1 -0
  264. package/dist/browser-process/port-allocator.js +198 -0
  265. package/dist/browser-process/port-allocator.js.map +1 -0
  266. package/dist/browser-process/process.d.ts +85 -0
  267. package/dist/browser-process/process.d.ts.map +1 -1
  268. package/dist/browser-process/process.js +235 -19
  269. package/dist/browser-process/process.js.map +1 -1
  270. package/dist/browser-process/signal-cleanup.d.ts +40 -0
  271. package/dist/browser-process/signal-cleanup.d.ts.map +1 -0
  272. package/dist/browser-process/signal-cleanup.js +105 -0
  273. package/dist/browser-process/signal-cleanup.js.map +1 -0
  274. package/dist/browser-process/widevine-cdm.d.ts +144 -0
  275. package/dist/browser-process/widevine-cdm.d.ts.map +1 -0
  276. package/dist/browser-process/widevine-cdm.js +298 -0
  277. package/dist/browser-process/widevine-cdm.js.map +1 -0
  278. package/dist/browser-profiles/chrome/populate-profile.d.ts.map +1 -1
  279. package/dist/browser-profiles/chrome/populate-profile.js +21 -22
  280. package/dist/browser-profiles/chrome/populate-profile.js.map +1 -1
  281. package/dist/connection/cdp-reconnection.d.ts +50 -0
  282. package/dist/connection/cdp-reconnection.d.ts.map +1 -0
  283. package/dist/connection/cdp-reconnection.js +75 -0
  284. package/dist/connection/cdp-reconnection.js.map +1 -0
  285. package/dist/connection/page-session.d.ts +114 -0
  286. package/dist/connection/page-session.d.ts.map +1 -0
  287. package/dist/connection/page-session.js +237 -0
  288. package/dist/connection/page-session.js.map +1 -0
  289. package/dist/connection/session-client.d.ts +34 -0
  290. package/dist/connection/session-client.d.ts.map +1 -0
  291. package/dist/connection/session-client.js +129 -0
  292. package/dist/connection/session-client.js.map +1 -0
  293. package/dist/crawler.d.ts +9 -88
  294. package/dist/crawler.d.ts.map +1 -1
  295. package/dist/crawler.js +157 -8
  296. package/dist/crawler.js.map +1 -1
  297. package/dist/fingerprinting/fingerprint-injector.d.ts +24 -114
  298. package/dist/fingerprinting/fingerprint-injector.d.ts.map +1 -1
  299. package/dist/fingerprinting/fingerprint-injector.js +305 -611
  300. package/dist/fingerprinting/fingerprint-injector.js.map +1 -1
  301. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts +1 -1
  302. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.d.ts.map +1 -1
  303. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js +16 -14
  304. package/dist/fingerprinting/fingerprint-overrides/datadome-bypass.js.map +1 -1
  305. package/dist/fingerprinting/fingerprint-overrides/index.d.ts +6 -2
  306. package/dist/fingerprinting/fingerprint-overrides/index.d.ts.map +1 -1
  307. package/dist/fingerprinting/fingerprint-overrides/index.js +6 -2
  308. package/dist/fingerprinting/fingerprint-overrides/index.js.map +1 -1
  309. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.d.ts +1 -1
  310. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js +4 -4
  311. package/dist/fingerprinting/fingerprint-overrides/keyboard-humanization.js.map +1 -1
  312. package/dist/fingerprinting/fingerprint-overrides/locale-spoofing.js +4 -4
  313. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts +18 -0
  314. package/dist/fingerprinting/fingerprint-overrides/navigator-override.d.ts.map +1 -0
  315. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js +136 -0
  316. package/dist/fingerprinting/fingerprint-overrides/navigator-override.js.map +1 -0
  317. package/dist/fingerprinting/fingerprint-overrides/override.d.ts +151 -0
  318. package/dist/fingerprinting/fingerprint-overrides/override.d.ts.map +1 -0
  319. package/dist/fingerprinting/fingerprint-overrides/override.js +14 -0
  320. package/dist/fingerprinting/fingerprint-overrides/override.js.map +1 -0
  321. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.d.ts.map +1 -1
  322. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js +46 -15
  323. package/dist/fingerprinting/fingerprint-overrides/platform-consistency.js.map +1 -1
  324. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts +43 -0
  325. package/dist/fingerprinting/fingerprint-overrides/registry.d.ts.map +1 -0
  326. package/dist/fingerprinting/fingerprint-overrides/registry.js +342 -0
  327. package/dist/fingerprinting/fingerprint-overrides/registry.js.map +1 -0
  328. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts +16 -0
  329. package/dist/fingerprinting/fingerprint-overrides/screen-override.d.ts.map +1 -0
  330. package/dist/fingerprinting/fingerprint-overrides/screen-override.js +175 -0
  331. package/dist/fingerprinting/fingerprint-overrides/screen-override.js.map +1 -0
  332. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.d.ts +1 -1
  333. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js +4 -4
  334. package/dist/fingerprinting/fingerprint-overrides/scroll-humanization.js.map +1 -1
  335. package/dist/fingerprinting/fingerprint-overrides/stealth-script.d.ts.map +1 -1
  336. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js +75 -9
  337. package/dist/fingerprinting/fingerprint-overrides/stealth-script.js.map +1 -1
  338. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts +1 -1
  339. package/dist/fingerprinting/fingerprint-overrides/ua-ch.d.ts.map +1 -1
  340. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js +34 -20
  341. package/dist/fingerprinting/fingerprint-overrides/ua-ch.js.map +1 -1
  342. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.d.ts.map +1 -1
  343. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js +28 -9
  344. package/dist/fingerprinting/fingerprint-overrides/webgl-spoofing.js.map +1 -1
  345. package/dist/fingerprinting/fingerprint-overrides/webrtc-spoofing.js +1 -1
  346. package/dist/fingerprinting/hardware-realism.d.ts +74 -0
  347. package/dist/fingerprinting/hardware-realism.d.ts.map +1 -0
  348. package/dist/fingerprinting/hardware-realism.js +155 -0
  349. package/dist/fingerprinting/hardware-realism.js.map +1 -0
  350. package/dist/fingerprinting/injection-planner.d.ts +133 -0
  351. package/dist/fingerprinting/injection-planner.d.ts.map +1 -0
  352. package/dist/fingerprinting/injection-planner.js +497 -0
  353. package/dist/fingerprinting/injection-planner.js.map +1 -0
  354. package/dist/fingerprinting/locale-resolver.d.ts +8 -1
  355. package/dist/fingerprinting/locale-resolver.d.ts.map +1 -1
  356. package/dist/fingerprinting/locale-resolver.js +26 -3
  357. package/dist/fingerprinting/locale-resolver.js.map +1 -1
  358. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts +4 -4
  359. package/dist/fingerprinting/non-apify-fingerprint-generator.d.ts.map +1 -1
  360. package/dist/fingerprinting/non-apify-fingerprint-generator.js +35 -69
  361. package/dist/fingerprinting/non-apify-fingerprint-generator.js.map +1 -1
  362. package/dist/fingerprinting/non-apify-profiles.json +10515 -8494
  363. package/dist/fingerprinting/os-consistency.d.ts +28 -0
  364. package/dist/fingerprinting/os-consistency.d.ts.map +1 -0
  365. package/dist/fingerprinting/os-consistency.js +45 -0
  366. package/dist/fingerprinting/os-consistency.js.map +1 -0
  367. package/dist/fingerprinting/profile-quality.d.ts +25 -0
  368. package/dist/fingerprinting/profile-quality.d.ts.map +1 -0
  369. package/dist/fingerprinting/profile-quality.js +310 -0
  370. package/dist/fingerprinting/profile-quality.js.map +1 -0
  371. package/dist/fingerprinting/profile-selector.d.ts +102 -0
  372. package/dist/fingerprinting/profile-selector.d.ts.map +1 -0
  373. package/dist/fingerprinting/profile-selector.js +168 -0
  374. package/dist/fingerprinting/profile-selector.js.map +1 -0
  375. package/dist/fingerprinting/ua-alignment.d.ts +83 -0
  376. package/dist/fingerprinting/ua-alignment.d.ts.map +1 -0
  377. package/dist/fingerprinting/ua-alignment.js +197 -0
  378. package/dist/fingerprinting/ua-alignment.js.map +1 -0
  379. package/dist/fingerprinting/ua-ch-brands.d.ts +88 -0
  380. package/dist/fingerprinting/ua-ch-brands.d.ts.map +1 -0
  381. package/dist/fingerprinting/ua-ch-brands.js +174 -0
  382. package/dist/fingerprinting/ua-ch-brands.js.map +1 -0
  383. package/dist/index.d.ts +5 -0
  384. package/dist/index.d.ts.map +1 -1
  385. package/dist/index.js +6 -0
  386. package/dist/index.js.map +1 -1
  387. package/dist/input/dropdown-selector.d.ts +90 -0
  388. package/dist/input/dropdown-selector.d.ts.map +1 -0
  389. package/dist/input/dropdown-selector.js +394 -0
  390. package/dist/input/dropdown-selector.js.map +1 -0
  391. package/dist/input/element-target.d.ts +152 -0
  392. package/dist/input/element-target.d.ts.map +1 -0
  393. package/dist/input/element-target.js +461 -0
  394. package/dist/input/element-target.js.map +1 -0
  395. package/dist/input/input-emulator.d.ts +85 -0
  396. package/dist/input/input-emulator.d.ts.map +1 -0
  397. package/dist/input/input-emulator.js +325 -0
  398. package/dist/input/input-emulator.js.map +1 -0
  399. package/dist/input/input-transport.d.ts +60 -0
  400. package/dist/input/input-transport.d.ts.map +1 -0
  401. package/dist/input/input-transport.js +28 -0
  402. package/dist/input/input-transport.js.map +1 -0
  403. package/dist/input/recording-transport.d.ts +32 -0
  404. package/dist/input/recording-transport.d.ts.map +1 -0
  405. package/dist/input/recording-transport.js +43 -0
  406. package/dist/input/recording-transport.js.map +1 -0
  407. package/dist/keyboard-layout.d.ts +2 -2
  408. package/dist/keyboard-layout.js +2 -2
  409. package/dist/navigation/page-navigation.d.ts +67 -0
  410. package/dist/navigation/page-navigation.d.ts.map +1 -0
  411. package/dist/navigation/page-navigation.js +122 -0
  412. package/dist/navigation/page-navigation.js.map +1 -0
  413. package/dist/network/network-watch.d.ts +110 -0
  414. package/dist/network/network-watch.d.ts.map +1 -0
  415. package/dist/network/network-watch.js +223 -0
  416. package/dist/network/network-watch.js.map +1 -0
  417. package/dist/page.d.ts +123 -104
  418. package/dist/page.d.ts.map +1 -1
  419. package/dist/page.js +348 -1129
  420. package/dist/page.js.map +1 -1
  421. package/dist/session/inject-hook.d.ts +24 -0
  422. package/dist/session/inject-hook.d.ts.map +1 -0
  423. package/dist/session/inject-hook.js +80 -0
  424. package/dist/session/inject-hook.js.map +1 -0
  425. package/dist/session/save.d.ts +21 -0
  426. package/dist/session/save.d.ts.map +1 -0
  427. package/dist/session/save.js +163 -0
  428. package/dist/session/save.js.map +1 -0
  429. package/dist/session/tar-data-dir.d.ts +18 -0
  430. package/dist/session/tar-data-dir.d.ts.map +1 -0
  431. package/dist/session/tar-data-dir.js +105 -0
  432. package/dist/session/tar-data-dir.js.map +1 -0
  433. package/dist/session/types.d.ts +80 -0
  434. package/dist/session/types.d.ts.map +1 -0
  435. package/dist/session/types.js +29 -0
  436. package/dist/session/types.js.map +1 -0
  437. package/dist/session-profile.d.ts +102 -0
  438. package/dist/session-profile.d.ts.map +1 -0
  439. package/dist/session-profile.js +163 -0
  440. package/dist/session-profile.js.map +1 -0
  441. package/dist/tsconfig.build.tsbuildinfo +1 -1
  442. package/package.json +15 -6
  443. package/dist/fingerprinting/custom-fingerprint-injector.d.ts +0 -87
  444. package/dist/fingerprinting/custom-fingerprint-injector.d.ts.map +0 -1
  445. package/dist/fingerprinting/custom-fingerprint-injector.js +0 -342
  446. package/dist/fingerprinting/custom-fingerprint-injector.js.map +0 -1
  447. package/dist/launcher-wrap.d.ts +0 -10
  448. package/dist/launcher-wrap.d.ts.map +0 -1
  449. package/dist/launcher-wrap.js +0 -11
  450. 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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAA+D,MAAM,qBAAqB,CAAC;AAExH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,mCAAmC;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC,CAAC,kDAAkD;AAC3F,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC,CAAC,kCAAkC;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AA8E/C,MAAM,OAAO,gBAAgB;IACzB,YACqB,IAA0B,EAC1B,QAAuB;QADxC;;;;mBAAiB,IAAI;WAAsB;QAC3C;;;;mBAAiB,QAAQ;WAAe;IACzC,CAAC;IAEJ;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CACd,gBAAwB,EACxB,cAAiC,EACjC,OAA6B;QAE7B,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,yBAAyB,CAAC;QAC9D,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;QACtC,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC;QACvD,MAAM,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,EAAE,CAAC;QAE3D,sCAAsC;QACtC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1F,qCAAqC;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/D,4CAA4C;QAC5C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAU,CAAC,GAAW,EAAE,EAAE;YACtE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAgB,CAAC;YAC3D,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC;QACzC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAErB,yEAAyE;QACzE,IAAI,eAAe,EAAE,CAAC;YAClB,qDAAqD;YACrD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;gBAClE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,gBAAgB,yCAAyC,CAAC,CAAC;gBAC1G,CAAC;YACL,CAAC;YAED,sDAAsD;YACtD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAU,CAAC,GAAW,EAAE,EAAE;oBACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAgB,CAAC;oBAC3D,OAAO,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC;gBAC7F,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBACrB,IAAI,UAAU,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,gBAAgB,yCAAyC,CAAC,CAAC;gBACvG,CAAC;YACL,CAAC;YAED,qCAAqC;YACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAErD,yCAAyC;YACzC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;YAE7E,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACJ,iEAAiE;YACjE,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,eAAe,EAAE;gBAChE,OAAO;gBACP,KAAK;gBACL,cAAc;gBACd,iBAAiB;aACpB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,gBAAgB,CAAC,OAAwC;QACnE,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,OAAO,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEvC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,mEAAmE;QACnE,yEAAyE;QACzE,gDAAgD;QAChD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK;YACxC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAC9B,cAAsB,EACtB,eAAyB;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAI7B,CAAC,GAAW,EAAE,UAAoB,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAsB,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,yCAAyC;YACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,6DAA6D,UAAU,CAAC,MAAM,mCAAmC,CAAC,CAAC;YACvI,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBACxC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;YACP,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,MAAM,cAAc,GAAa,EAAE,CAAC;YAEpC,qCAAqC;YACrC,KAAK,MAAM,cAAc,IAAI,UAAU,EAAE,CAAC;gBACtC,IAAI,WAAW,GAAG,KAAK,CAAC;gBAExB,wDAAwD;gBACxD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,cAAc,CAAsB,CAAC;gBAEzE,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACvB,WAAW,GAAG,IAAI,CAAC;oBACnB,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACxC,CAAC;gBAED,IAAI,WAAW,EAAE,CAAC;oBACd,UAAU,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC;YAED,oEAAoE;YACpE,kEAAkE;YAClE,oEAAoE;YACpE,+DAA+D;YAC/D,kEAAkE;YAClE,4BAA4B;YAC5B,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5D,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/E,CAAC,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;QAEpC,kDAAkD;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qCAAqC,cAAc,uBAAuB,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAChI,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,IAAI,KAAK,CAAC,6BAA6B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5H,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,qBAAqB,CAC/B,iBAAyB,EACzB,eAAyB,EACzB,OAAwB;QAExB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC;QAElH,oEAAoE;QACpE,kEAAkE;QAClE,sEAAsE;QACtE,uEAAuE;QACvE,yBAAyB;QACzB,MAAM,YAAY,GAAG,KAAK,IAAsB,EAAE;YAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAsB,CAAC,YAAoB,EAAE,EAAE;gBACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAgB,CAAC;gBACtE,IAAI,CAAC,SAAS;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAExC,+DAA+D;gBAC/D,iEAAiE;gBACjE,6DAA6D;gBAC7D,+CAA+C;gBAC/C,6DAA6D;gBAC7D,+DAA+D;gBAC/D,6DAA6D;gBAC7D,MAAM,OAAO,GAAG,CAAC,EAAe,EAAE,EAAE;oBAChC,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3E,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;oBACtD,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;wBACvC,OAAO;4BACH,KAAK,EAAE,IAAI;4BACX,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE;yBACvE,CAAC;oBACN,CAAC;oBACD,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;gBAChD,CAAC,CAAC;gBAEF,qEAAqE;gBACrE,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC;gBACvC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,6FAA6F,CAAC,CAAC;oBACxI,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;wBAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BACxB,OAAO,OAAO,CAAC,OAAsB,CAAC,CAAC;wBAC3C,CAAC;oBACL,CAAC;oBAED,kEAAkE;oBAClE,MAAM,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC;oBACrD,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;wBACjD,OAAO,OAAO,CAAC,WAA0B,CAAC,CAAC;oBAC/C,CAAC;gBACL,CAAC;gBAED,uEAAuE;gBACvE,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;gBACjC,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,eAAe,GAAG;wBACpB,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;wBACrE,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;wBACxC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;wBACxC,GAAG,WAAW,UAAU;wBACxB,WAAW,WAAW,EAAE;qBAC3B,CAAC;oBAEF,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;wBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;wBACnD,IAAI,OAAO,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;4BACnC,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC5B,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC5B,CAAC,EAAE,iBAAiB,CAAC,CAAC;YAEtB,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,qEAAqE;QACrE,sEAAsE;QACtE,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,yDAAyD;YACzD,sEAAsE;YACtE,iEAAiE;YACjE,oEAAoE;YACpE,qEAAqE;YACrE,2BAA2B;YAC3B,MAAM,aAAa,GAAG,CAAC,CAAC;YACxB,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACjE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;gBAClE,MAAM,YAAY,EAAE,CAAC;gBACrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;gBACrE,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,0DAA0D,iBAAiB,yCAAyC,CAAC,CAAC;YAC1I,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,sCAAsC;YACtC,MAAM,YAAY,EAAE,CAAC;YACrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,8BAA8B;QAC9B,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,EAAE,cAAc,EAAE;gBACpE,OAAO;gBACP,iBAAiB;aACpB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CACnC,gBAAwB,EACxB,cAAsB,EACtB,eAAyC;QAEzC,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,wEAAwE;QACxE,sEAAsE;QACtE,gEAAgE;QAChE,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,mBAAmB,GAAG,EAAE,CAAC;QAE/B,OAAO,cAAc,GAAG,iBAAiB,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;YAC9F,oEAAoE;YACpE,qEAAqE;YACrE,4DAA4D;YAC5D,iDAAiD;YACjD,mEAAmE;YACnE,oDAAoD;YACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CACnC,CAAC,WAAmB,EAAE,SAAiB,EAAE,EAAE;gBACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAgB,CAAC;gBACpE,IAAI,CAAC,QAAQ;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAExD,gDAAgD;gBAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAgB,CAAC;gBAEtE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChB,kDAAkD;oBAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;oBACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;oBAE3F,IAAI,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;wBAC9B,4DAA4D;wBAC5D,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC;wBAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBAC5C,CAAC;oBAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAC7C,CAAC;gBAED,4DAA4D;gBAC5D,4DAA4D;gBAC5D,4DAA4D;gBAC5D,4DAA4D;gBAC5D,6DAA6D;gBAC7D,uDAAuD;gBACvD,eAAe;gBACf,2DAA2D;gBAC3D,8DAA8D;gBAC9D,iEAAiE;gBACjE,MAAM,OAAO,GAAG,CAAC,EAAe,EAAE,EAAE;oBAChC,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC3E,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;oBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;oBACtD,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;wBACvC,OAAO;4BACH,KAAK,EAAE,IAAI;4BACX,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE;yBACvE,CAAC;oBACN,CAAC;oBACD,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;gBAChD,CAAC,CAAC;gBACF,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YACzD,CAAC,EACD,gBAAgB,EAChB,cAAc,CACjB,CAAC;YAEF,kEAAkE;YAClE,mDAAmD;YACnD,IAAI,CAAC,MAAM;gBAAE,MAAM;YAEnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,WAAW;oBAAE,MAAM;gBACvB,iEAAiE;gBACjE,+CAA+C;YACnD,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAClB,cAAc,EAAE,CAAC;gBACjB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,+BAA+B;YAC5G,CAAC;iBAAM,CAAC;gBACJ,gEAAgE;gBAChE,iEAAiE;gBACjE,8DAA8D;gBAC9D,gEAAgE;gBAChE,aAAa,EAAE,CAAC;gBAChB,IAAI,aAAa,IAAI,mBAAmB,EAAE,CAAC;oBACvC,MAAM;gBACV,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,WAAW,cAAc,4BAA4B,gBAAgB,GAAG,CAAC,CAAC;QAC9F,CAAC;IACL,CAAC;CACJ"}
@@ -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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"}